HashMap、HashTable
1. HashMap
有关HashMap的所有问题,看这一篇就够了
https://juejin.im/post/6844903574552461320#heading-21
2. HashTable
对于HashTable而言,它在很大程度上和HashMap的实现差不多,他们两者之间只存在几点的不同.
初始化
public Hashtable() {
this(11, 0.75f);
}
默认创建容量为11,负载因子为0.75的哈希表
扩容
protected void rehash() {
...
int newCapacity = (oldCapacity << 1) + 1;
...
}
扩容成原始容量*2+1
3.HashMap和HashTable的区别
第一:HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。
第二:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。如下:
当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以
第三:Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用HashTable,没有涉及就采用HashMap,但是在Collections类中存在一个静态方法:synchronizedMap(),该方法创建了一个线程安全的Map对象,并把它作为一个封装的对象来返回,所以通过Collections类的synchronizedMap方法是可以我们你同步访问潜在的HashMap。