面试题集锦

1.HashMap的实现原理

>HashMap继承了AnstractMap抽象类,毕实现了Map Cloneable serializable接口

>抽象类get contain方法都是通过迭代器遍历来实现。

>HashMap里的每一个无素就是个Entry,Entry里有key,有value.有next元素和一个hash属性


>初始化时,默认设置16的Entry数组变量table用于存储数据,有个扩容因子0.75

>HashMap的数据存储结构是数据加链表,一个Entry数组和Entry单向链表。JDK1.8以后使用数组+链表+红黑树实现

>1.7在存储时,先根据key得到一个hash值,在通过indexFor方法与length-1得到一个数组存储的索引值进行元素遍历,如果元素已经存在就替换旧的数据,否则创建一个新的节点,并添加到数组中。

>添加新元素前会进行一个扩容判断

>取数据时就通过索引+链表来查找

2.线程锁的分类

>第一种Java提供了一种内置锁:同步代码块Synchronized Block和同步方法,锁可以是方法所在的对象,也可以是class作为对象。它是一个互斥锁,最多只有一个线程持有这锁,会有等待和阻塞的情况,更有可能死锁。

>这种锁的性能是十分糟糕的,幸运的是可以缩小同步代码块的作用范围,来确保线程的并发性以及安全性

>第二种可以使用ReentrantLock实现

>由于synchronized是在JVM层面实现的,因此系统可以监控锁的释放与否;

>而ReentrantLock是使用代码实现的,系统无法自动释放锁,需要在代码中的finally子句中显式释放锁lock.unlock()。

>另外,在并发量比较小的情况下,使用synchronized是个不错的选择;但是在并发量比较高的情况下,其性能下降会很严重,此时ReentrantLock是个不错的方案。

3.在项目中有遇到线程锁需求吗?怎么优化并发的

4.Spring的启动原理

5.Springboot的启动原理

6.怎么解决秒杀,支付的幂等问题

7.说说数据库的优化

8.说说JVM的优化

9.Java的堆与栈 方法区 常量区 静达区

10.讲讲Java的垃圾回收机制

11.NoSQL的运用场景,你的项目在哪里用到它

12.如何定位内存溢出

你可能感兴趣的:(面试题集锦)