Spring MVC : DispatcherServlet
Spring : AOP和IOC
MyBatis : ORM
HashMap
数据结构
初始数组、链表、红黑树
数组容量
为2的倍数
- 提高运算速度
- 增加数据的散列度
- 减少内存碎片
Hash函数与pos定位
hashcode的高16位于低16位进行异或求模,增加数据的散列度。降低数据的hash冲突
插入数据冲突
通过单链表解决冲突,如果链表长度超过8,进行单链表与红黑树的转换,用来提高查询速度
扩容
扩容条件
实际数据节点数大于等于容量大小*负载因子(一般初始为3/4)
扩容后的数据排布
要么是原始下标位置,要么是原始下标+原容量的位置
序列化
只存储数组的容量、实际节点数量和各个节点的key、value值
并发读写的风险
在多线程put的情况下,在容量超过填充因子的时候进行rehash,HashMap为了避免尾部遍历,在链表的插入使用头插法,多线程场景下可能会出现死循环。
ConcurrentHashMap
- 并发控制与分段锁思想
- 1.8中的CAS自旋锁(乐观锁模式提高性能)
- 红黑树的启用条件——链表大于8且容量大于64