HashTable是个比较古老的实现,现在已经不推荐使用,虽然它比HashMap多了支持同步,但在同步并发方面ConcurrentHashMap更强,而不考虑同步的话,HashMap效率比它高了不少,正如官方注释一样:“If a thread-safe implementation is not needed, it is recommended to use HashMap
in place of Hashtable. If a thread-safe highly-concurrent implementation is desired, then it is recommended to use java.util.concurrent.ConcurrentHashMap
in place of Hashtable.”
在get()/put()/remove()等方法上,HashTable都加上了synchronized
关键字,以此来实现同步,但熟悉JVM的童鞋都知道,synchronized关键字的代价很高,涉及到内核态和用户态的切换,所有HashTable的效率比较低。
在计算数组下标时,HashTable用了相对比较简单的求模运算,而不像HashMap那样做了移位优化:1
int index = (hash & 0x7FFFFFFF) % tab.length;
获取:public synchronized V get(Object key)
1 | public synchronized V get(Object key) { |
可见,HashTable内部在处理冲突时,只是单纯地用链来实现,而不像HashMap一样,在冲突过多时,使用红黑树来优化。
添加:public synchronized V put(K key, V value)
1 | public synchronized V put(K key, V value) { |
HashTable不允许空的key,也不允许空的value。
添加一个新的键值对:private void addEntry(int hash, K key, V value, int index)
1 | private void addEntry(int hash, K key, V value, int index) { |
在这里可以看出,当有新的冲突出现时,新的冲突会插在链头(也许是用了程序局部性原理)
删除:public synchronized V remove(Object key)
1 | public synchronized V remove(Object key) { |
重散列算法:protected void rehash()
1 | protected void rehash() { |