java中hashmap和hashtable和hashset的區別

hastTable和hashMap的區別:
(1)Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現。
(2)這個不一樣便是最重要的一點:Hashtable中的方法是同步的,而HashMap方法(在缺省狀況下)是非同步的。便是說,在多線程應用程序中,不用專門的操做就安全地能夠使用Hashtable了;而對於HashMap,則須要額外的同步機制。但HashMap的同步問題可經過Collections的一個靜態方法獲得解決:
Map Collections.synchronizedMap(Map m)
這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的全部方法,使得底層的HashMap即便是在多線程的環境中也是安全的。
(3)只有HashMap可讓你將空值做爲一個表的條目的key或value。HashMap中只有一條記錄能夠是一個空的key,但任意數量的條目能夠是空的value。這就是說,若是在表中沒有發現搜索鍵,或者若是發現了搜索鍵,但它是一個空的值,那麼get()將返回null。若是有必要,用containKey()方法來區別這兩種狀況。

其它的一些資料:

1.HashTable的方法是同步的,HashMap未經同步,因此在多線程場合要手動同步HashMap這個區別就像Vector和ArrayList同樣。(最主要的區別)
2.HashTable不容許null值(key和value都不能夠),HashMap容許null值(key和value均可以,只允許有一個null值的key,能夠有多個

搜索

null值的value)。    3.HashTable有一個contains(Object value),功能和containsValue(Object value)功能同樣。    4.HashTable使用Enumeration,HashMap使用Iterator。以上只是表面的不一樣,它們的實現也有很大的不一樣。    5.HashTable中hash數組默認大小是11,增長的方式是 old*2+1。HashMap中hash數組的默認大小是16,並且必定是2的指數。    6.哈希值的使用不一樣,HashTable直接使用對象的hashCode,代碼是這樣的:      int hash = key.hashCode();      int index = (hash & 0x7FFFFFFF) % tab.length;而HashMap從新計算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);}以上只是一些比較突出的區別,固然他們的實現上仍是有不少不一樣的,好比HashMap對null的操做。
相關文章
相關標籤/搜索