回覆列表
  • 1 # 騷小皓

    hashmap和hashtable的區別

    1、繼承的父類不同

    Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map介面。

    2、執行緒安全性不同

    javadoc中關於hashmap的一段描述如下:此實現不是同步的。如果多個執行緒同時訪問一個雜湊對映,而其中至少一個執行緒從結構上修改了該對映,則它必須保持外部同步。

    3、是否提供contains方法

    HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因為contains方法容易讓人引起誤解。

    Hashtable則保留了contains,containsValue和containsKey三個方法,其中contains和containsValue功能相同。

    4、key和value是否允許null值

    Hashtable中,key和value都不允許出現null值。但是如果在Hashtable中有類似put(null,null)的操作,編譯同樣可以透過,因為key和value都是Object型別,但執行時會丟擲NullPointerException異常,這是JDK的規範規定的。

    HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,可能是 HashMap中沒有該鍵,也可能使該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。

    5、兩個遍歷方式的內部實現上不同

    Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。

    6、hash值不同

    雜湊值的使用不同,HashTable直接使用物件的hashCode。而HashMap重新計算hash值。hashCode是jdk根據物件的地址或者字串或者數字算出來的int型別的數值。

    7、內部實現使用的陣列初始化和擴容方式不同

    HashTable在不指定容量的情況下的預設容量為11,而HashMap為16,Hashtable不要求底層陣列的容量一定要為2的整數次冪,而HashMap則要求一定為2的整數次冪。Hashtable擴容時,將容量變為原來的2倍加1,而HashMap擴容時,將容量變為原來的2倍。

    HashMap簡介

    HashMap是在JDK1.2中引入的Map的實現類。HashMap是基於雜湊表實現的,每一個元素是一個key-value對,其內部透過單鏈表解決衝突問題,容量不足(超過了閥值)時,同樣會自動增長。

    Hashtable簡介

    Hashtable同樣是基於雜湊表實現的,同樣每個元素是一個key-value對,其內部也是透過單鏈表解決衝突問題,容量不足(超過了閥值)時,同樣會自動增長。

    Hashtable也是JDK1.0引入的類,是執行緒安全的,能用於多執行緒環境中。

    Hashtable同樣實現了Serializable介面,它支援序列化,實現了Cloneable介面,能被克隆。

  • 中秋節和大豐收的關聯?
  • 蛇盤瘡應該吃什麼食物?