其實HashTable、HashMap在線程中和Vector、ArrayList的區別一樣;下面就來詳細說說:
1.繼承父類不同
Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類;但二者都實現了Map接口。
2.線程的安全性
1. HashTable是同步(方法中使用了Synchronize)的;而HashMap是未同步(方法中缺省Synchronize)的。
2.Hashtable 線程安全,因為它每個方法中都加入了Synchronize,在多線程並發的環境下,可以直接使用Hashtable,不需自己在加同步;
HashMap線程不安全,因為HashMap底層是一個Entry數組,當發生hashmap沖突的時候,hashmap是采用鏈表的方式來解決的,在對應的數組位置存放鏈表的頭結點。對鏈表而言,新加入的節點會從頭結點加入。
3.是否有contains方法
1.HashTable有一個contains(Object value)方法,功能和containsValue方法(Object value)功能一樣。
2.HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。
4.可否允許有null值
key、value都是對象,但是不能擁有重復key值,value值可以重復出現。
1.Hashtable中,key和value都不允許出現null值。
2.HashMap允許null值(key和value都可以),因為在HashMap中null可以作為健,而它對應的值可以有多個null。
5.遍歷方式內部實現不同
1.HashTable使用Enumeration,HashMap使用Iterator。
6.hash值不一樣
1.HashTable直接使用對象的hashCode,如下:
//hashCode是jdk根據對象的地址或者字符串或者數字算出來的int類型的數值
int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length;
2.HashMap要重新計算key值和hash值,如下:
int hash = hash(k); int i = indexFor(hash, table.length); static int hash(Object x) { int h = x.hashCode(); h += ~(h << 9); h ^= (h >>> 14); h += (h << 4); h ^= (h >>> 10); return h; } static int indexFor(int h, int length) { return h & (length-1); }
7.數組初始化和擴容不同
1.HashTable中hash數組默認大小是11,增加的方式是 arr*2+1。
2.HashMap中hash數組的默認大小是16,而且一定是2的指數。
謝謝觀看!