HashMap
- 数组和链表组合构成
- hash code 相等的value存入链表
- size/capacity >0.75 时 会扩容,长度是原数组的2倍
- Hash的公式---> index = HashCode(Key) & (Length - 1)
- 扩容后,原来的数组成员会根据公式重新分配index. JAVA8之前链表采用前插,在多线程的情况下容易引起死循环。JAVA8之后采用了后插方式避免死循环。但是JAVA8之后由于put和get均为加锁因此仍然不是线程安全的
- Hash的公式利用位运算代替取模提高效率X % 2^n = X & (2^n – 1)
- 初始容量16,应该是个经验值
- 重写equals方法需要重写hashCode
- 线程不安全的替代方案
- Collections.synchronizedMap(Map)
- Hashtable
- ConcurrentHashMap
一般使用ConcurrentHashMap,前二者因为在所有操作上加锁效率都比较差.
Hashtable 不允许键或值为 null 的,HashMap 的键值则都可以为 null。
Hashtable使用的是安全失败机制(fail-safe),这种机制会使此次读到的数据不一定是最新的数据。HashMap使用fail-fast.
ConcurrentHashMap由Segment 数组、HashEntry 组成.Segment 包含HashEntry,并 使用volatile修饰。
posted on 2020-06-08 10:12 leonworld2011 阅读(136) 评论(0) 编辑 收藏 举报