HashMap与Hashtable的区别在面试的时候经常会有问到,下面是总结的几点不同之处,当然有几点是不太重要的:
1、 继承的父类不一样:
HashMapextends AbstractMap<K,V> implements Map<K,V>, Cloneable,Serializable
Hashtableextends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable
2、HashMap默认初始容量大小16,Hashtable默认初试容量大小11
3、扩容方式上:HashMap newCapacity = 2 *table.length
Hashtable newCapacity =(oldCapacity << 1) + 1;
4、hash值的计算
HashMap的hash值计算为:
final int hash(Object k) {
int h = 0;
if (useAltHashing) {
if (k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h = hashSeed;
}
h ^= k.hashCode();
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
Hashtable的hash值计算为:
private int hash(Object k) {
if (useAltHashing) {
if (k.getClass() == String.class) {
return sun.misc.Hashing.stringHash32((String) k);
} else {
int h = hashSeed ^ k.hashCode();
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
} else {
return k.hashCode();
}
}
5、index值的计算
HashMap的index值计算为:
static int indexFor(int h, int length) {
return h & (length-1);
}
Hashtable的index值计算为:
int index = (hash & 0x7FFFFFFF) % tab.length;
6、线程安全性:HashMap是线程不安全的,Hashtable 是线程安全的
7、是否为空值:HashMap的value可以为null,Hashtable的value不能为null
一般情况下,只要掌握上述7点,应该就够了,如果有好的建议请留言,我会及时更正,谢谢