HashMap和HashTable区别
- 底层结构:
- HashMap(1.8)采用的是:数组+链表+红黑树
- HashTable采用的是:数组+链表
- 安全性:
- HashMap不是线程安全的
- HashTable是线程安全的(方法中加上了synchronized)
- 是否可以null值
- HashMap的k只能一个null,value可以为多个null
- HashTable的k-v都不能出现null
- 加载方式
- HashMap是饿汉式(无参new时,创建的时null的数组)
- HashTable是饿汉式(无参new时,直接创建数组容量11)
- 数组底层类型不同
- HashMap底层数组类型是:HashMap$Node
- HashTable底层数组类型是:HashTable&Entry
- 扩容因子都是:0.75
- 扩容
- HashMap:第一次数组是16(懒汉式),扩容是2倍
- HashTable:第一次数组容量是11(饿汉式),扩容是(2*N+1)
- 效率:
- HashMap效率高
- HashTable效率低(因为使用了同步锁)
- 带参初始化:
- HashMap初始化时,底层数组(桶)必须是2的幂次方——这与底层数组定位有关
- Hashtable初始时,底层数组(桶)不用2的幂次方——采用的时取模的方式
这与底层key的定位算法有关:
1.HashMap元素定位:计算key的hash,再利用key的hash与数组长度-1(length-1)进行按位与操作,因此数组长度需要是2的幂次方
2.HashTable元素定位采用的是 (e.hash & 0x7FFFFFFF) % newCapacity,简单理解就是取模操作,因此不需要2的幂次方