1、
HashMap | ConcurrentHashMap | Hashtable | |
实现 | jdk7数组+链表; jdk8数组+链表(小于8)+红黑树(大于8) | jdk7数组+链表; jdk8数组+链表(小于8)+红黑树(大于8) | 数组+链表 |
线程安全 | × | √ | √ |
锁 | jdk7桶锁;jdk8行级锁 | 全局锁 | |
性能 | 好 | 中 | 差 |
KV | K/V均可为null get(K)返回null不能说明K键不存在 | K/V不可为null | K/V不可为null |
其他 | 转化为同步: Collections.synchronizeMap(hashMap); | 废弃 |
2、HashMap实现原理
jdk7:数组+链表
jdk8:(size<8)数组+链表;(size>8)数组+红黑树
3、获取数组下标
对key的hash值再进行hash处理,h&(length-1)实质是截取h的后几位,保证了下标不发生数组越界。
数组扩容
默认大小16,每次扩容变为原来的两倍。
保证数组的长度为2的n次方,则length-1的二进制形式为011111111,h&(length-1)就能完整的取到h的后几位,反过来看,如果length-1的后面某一位为0,则h&(length-1)的该位置永远为0,即数组中部分下标无法到达,永远都是空的。