0%

HashMap和Hashtable的区别

HashMap和Hashtable一样,同样都存储的键值对。

区别的地方主要区别在于

HashMap是线程不安全的,而Hashtable是线程安全的。

Hashtable在对集合操作的时候都加上了synchronized来保证线程的同步。

HashMap可以使用null作为key,而Hashtable则不允许null作为key。

HashMap中如果key为null,则key的hash则为0.

1
2
3
4
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

Hashtable如果传入的key为null,则直接抛出控指针异常

1
2
3
4
5
6
 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数组的长度直接进行取模

1
2
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸

1
2
3
4
5
6
7
8
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);
}

Hashtable的源码比HashMap简单不少,hash冲突链表也不会自动转为红黑树

如果要是在高并发下使用HashMap的话,可以使用java并发包下的ConcurrentHashMap,采用分段锁,效率更高