-
Hashmap
HashMap 是一种存取高效但不保证有序的常用容器
在JDK1.7中,“数组+链表”,不安全
在JDK1.8中,“数组+链表+红黑树”不安全,
- 解决并发问题,如何解决线程不安全问题
1、Collections.synchronizedMap()
2、使用ConcurrentHashMap:采用分段锁机制
JDK 1.5中,Segment,采用分段锁机制,默认分配16个锁,比Hashtable效率提高16倍
JDK 1.7中,Segment数组,Segment这个类继承了重入锁ReentrantLock,使得Segment可以并发,解决了线程安全,又提高了效率
JDK 1.8中,CAS和synchronized,数据结构还是数组+链表/红黑二叉树,synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。
3、使用HashTable(不推荐,相对线程安全,无法做到完全同步)
- HashMap是如何新增的
1.判断hashmap有没有初始化
2.判断key是否为空,如果为空,则保存table[0]位置
3.如果不为空,对key进行hash,结果& 数组的长度,获得应保存的位置
4.如果保存的位置为空,则保存,如果有,则说明存在冲突
5.解决冲突:先遍历链表,如果有相同的value,就更新,没有,就头插法添加到表头(1.8是尾插法)
(需要判断阈值,是否需要扩容,如果达到阈值,则需要先扩容,再插入)
- 为什么要引入红黑树
红黑树可以自动使用二分法进行定位,效率高(长度超过8时才使用红黑树,),比链地址法效率高