HashTable和HashMap的區別


其實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的指數。

 

謝謝觀看!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM