HashMap
Posted leonworld
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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修饰。
以上是关于HashMap的主要内容,如果未能解决你的问题,请参考以下文章