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.如何定位内存溢出