HashMap和Hashtable一样,同样都存储的键值对。
区别的地方主要区别在于
HashMap是线程不安全的,而Hashtable是线程安全的。
Hashtable在对集合操作的时候都加上了synchronized来保证线程的同步。
HashMap可以使用null作为key,而Hashtable则不允许null作为key。
HashMap中如果key为null,则key的hash则为0.
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Hashtable如果传入的key为null,则直接抛出控指针异常
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
}
HashMap的初始容量为16,Hashtable初始容量为11
两者计算hash的方法不同
Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
// 1.8中这句话是不存在的,是直接使用(n - 1) & hash,n是的大小
static int indexFor(int h, int length) {
return h & (length-1);
}
网友评论