1.在1.8后HashMap由链表转红黑树的阈值为什么是8?
红黑树插入效率慢,例如我插入一个001、002、003会进行左旋,进行数据交换,效率较低,阈值为8是想达到一个平衡。
红黑树中的TreeNode是链表中的Node所占空间的2倍。
虽然红黑树的查找效率为o(logN),要优于链表的o(N),但是当链表长度比较小的时候,即使全部遍历,时间复杂度也不会太高。
实验证明,之所以是8,hash碰撞发生8次的概率已经降低到了0.00000006。
链表长度大于8时,链表性能已经很差了。
2.在JDK1.7版本的HashMap为什么会出现死循环?
存储结构:数组 + 链表
主要是扩容时多线程头插法导致的
参考:https://blog.csdn.net/gupaoedu_tom/article/details/124449573
3.ArrayList的Fast-fail(快速失败)机制
使用了Iterator迭代器;
在迭代过程中集合发生了修改(add、remove等),导致expectedModCount != modCount ,抛出ConcurrentModificationException;
4.Integer类的缓存机制,缓存的范围是多少?
-128~127
5.垃圾回收算法,三色标记,安全点
垃圾回收算法:
标记-清除算法
标记-整理算法
标记-复制算法
分代收集算法(年轻代、老年代分代使用以上三种算法)
三色标记:黑白灰,从GC root开始标记对象,白色为垃圾
安全点:https://blog.csdn.net/u010502101/article/details/120030517
6.mysql索引失效
https://blog.csdn.net/nanyan_xixi/article/details/125825332
7.InnoDB索引和数据页理解
https://blog.csdn.net/agonie201218/article/details/126094568
8.@Transactional 失效的几种情况
https://blog.csdn.net/Ahuuua/article/details/123876919
类内部访问@Transactional失效原因补充:
例:
类A中a方法调用b方法,b方法加@Transactional,生成代理类B代理A,B中a方法直接调用A方法中a方法,B中b方法加事务增强并调用A中b方法。
外部调用A中b方法,有事务,因为注入的对象是代理对象B,相当于调用B中的b方法;
外部调用A中a方法,b方法无事务,因为注入的对象是代理对象B,B中的a方法调用的是A中的a方法,而A中的a方法调用的是自己的b方法,并不是B的b方法,所以事务失效。