HashMap和Hashtable的区别
- Hashtable是线程安全,而HashMap则非线程安全。
- Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步。所以HashMap性能高。
- HashMap可以使用null作为key,而Hashtable则不允许null作为key。
- HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口。
- HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
- HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。
- HashMap和Hashtable的底层实现都是数组+链表结构实现。
- 判断是否含有某个键
在HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对
应的值为null。当get()方法返回null 值时,既可以表示HashMap 中没有该键,也可
以表示该键所对应的值为null。因此,在HashMap 中不能用get()方法来判断HashM
ap 中是否存在某个键,而应该用containsKey()方法来判断。Hashtable 的键值都不能
为null,所以可以用get()方法来判断是否含有某个键。 - 两者计算hash的方法不同:
Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap则是二次hash():
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {
return h & (length-1);
}