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
  • 线程不安全的替代方案
  1. Collections.synchronizedMap(Map)
  2. Hashtable
  3. ConcurrentHashMap

一般使用ConcurrentHashMap,前二者因为在所有操作上加锁效率都比较差.

Hashtable 不允许键或值为 null 的,HashMap 的键值则都可以为 null。

Hashtable使用的是安全失败机制(fail-safe),这种机制会使此次读到的数据不一定是最新的数据。HashMap使用fail-fast.

ConcurrentHashMap由Segment 数组、HashEntry 组成.Segment 包含HashEntry,并 使用volatile修饰。

 

以上是关于HashMap的主要内容,如果未能解决你的问题,请参考以下文章

HashMap学习

MAP

HashMap

HashMap问答

Map的实现

HashMapConcurrentHashMapHashTable