闲来无事! ! 看看HashMap
HashMap1.7 的问题还有1.7 和1.8 的差别。
HashMap 是一个并发不安全的容器,在迭代操作是采用的是fast-fail 机制;在并发添加操作中会出现丢失更新的问题;因为采用头插法在并发扩容时会产生环形链表的问题,导致CPU 到达100%,甚至宕机。
解决并发问题可以采用
- Java 类库提供的Collections 工具包下的Collections.synchronizedMap()方法,返回一个线程安全的Map
- 或者使用并发包下的 ConcurrentHashMap,ConcurrentHashMap采用分段锁机制实现线程安全
- 使用HashTable (不推荐)
Hash1.7 和1.8 最大的不同在于1.8 采用了“数组+链表+红黑树”的数据结构,在链表长度超过8 时,把链表转化成红黑树来解决HashMap 因链表变长而查询变慢的问题;其次
- 在hash 取下标时将1.7 的9次扰动(5次按位与和4次位运算)改为2次(一次按位与和一次位运算)
- 1.7 的底层节点为Entry,1.8 为node ,但是本质一样,都是Map.Entry 的实现
- 还有就是在存取数据时添加了关于树结构的遍历更新与添加操作,并采用了尾插法来避免环形链表的产生
- 但是并发丢失更新的问题依然存在。