Java中HashMap和HashTable的區別

已發表: 2021-06-02

如果您正在學習 Java 及其應用程序,那麼您一定遇到過 HashMap 和 HashTable。 它們都是 Java Collection 框架中最重要的類之一。 在使用 Java 進行開發時,您將廣泛使用它們,這就是為什麼了解它們的差異至關重要的原因。

在以下幾點中,我們將詳細介紹 HashTable 與 HashMap 主題並解釋兩者之間的區別:

目錄

什麼是哈希映射?

自 Java 1.2 引入以來,HashMap 一直在 Java 的集合中。 它允許您執行 Java 的 Map 接口的基本實現。 HashMap 將數據存儲在 (Key, Value) 對中,要訪問它們,您必須使用另一種類型的索引,例如整數。

在這裡,您使用一個對像作為另一個對象(值)的鍵(索引),因此使用(鍵,值)對。 如果添加重複鍵,它將替換相應鍵的元素。

HashMap的特點

要了解 HashTable 與 HashMap 之間的區別,首先必須了解它們的特性。 這將使您熟悉它們的基礎知識。 HashMap 具有以下特點:

  • 它是 java.util 包的一部分。
  • 它擴展了一個抽像類 AbstractMap,它提供了 Map 接口的不完整實現。
  • 除了實現 Map 接口,它還實現了 Serializable 和 Cloneable 接口。
  • 它允許重複值,但不允許重複鍵。 這意味著一個鍵不能有多個值,但多個鍵可以有一個值。
  • 在 HashMap 中只能使用一次 null 鍵,但可以使用多個 null 值。
  • 它不保證地圖的順序,特別是順序是否會隨著時間的推移保持不變。 HashMap 與 HashTable 幾乎相似,但不同步。
  • HashSet 在內部使用 HashMap。

什麼是哈希表?

您使用 HashTable 類來實現將鍵映射到值的哈希表。 在這裡,您可以使用非空對像作為鍵或值。 請記住,要成功地從哈希表中存儲和檢索對象,用作鍵的對象必須實現 hashCode 方法和 equals 方法。

哈希表以數組格式存儲數據,每個數據值都有唯一的索引值。 如果您知道所需的索引,這允許您非​​常快速地訪問特定數據。

哈希表的特點

HashTable 有其獨特的特性,就像 HashMap 一樣。 但是,這些特性使其在許多方面都與 HashMap 不同:

  • HashTable 與 HashMap 非常相似,但是是同步的。
  • 它將鍵值對存儲在哈希表中。
  • 在這裡,您指定一個用作鍵的對象和您要與之關聯的值。 然後你散列鍵並使用生成的散列碼作為你在表中存儲值的索引。
  • Hashtable類的默認容量是11,加載因子是0.75。
  • HashMap 不提供枚舉,而 Hashtable 不提供快速失敗枚舉。

HashMap 和 HashTable 的區別

既然您知道了 HashMap 和 HashTable 的特別亮點,我們現在將它們進行比較,看看兩者之間的顯著差異:

哈希映射哈希表
它是非同步的。 如果不使用適當的同步代碼,您將無法在此處共享多個線程,因為它不是線程安全的。 它是同步的。 您可以與許多線程共享它,因為它是線程安全的。
它繼承了 AbstractMap 類。 它繼承了 Dictionary 類。
在這裡,迭代器是快速下降的。 在 HashTable 中,枚舉器不是快速下降的。
Iterator 遍歷 HashMap。 Enumerator 和 Iterator 遍歷 HashTable。
您可以通過調用代碼使 HashMap 同步
地圖 m = Collections.synchronisedMap(hashMap);
哈希表在內部是同步的,您不能使用任何代碼取消同步它們。
它相當快。 它比 HashMap 相對慢。
HashMap 是一個新類,最近在 JDK 1.2 中引入。 HashTable 是一個遺留類。
它允許多個空值和一個空鍵。 它不允許任何空值或鍵。

編碼示例

以下是 HashMap 和 HashTable 的工作示例,以便您了解 HashMap 與 HashTable 的區別。

輸入:

導入 java.util.*;

導入java.lang.*;

導入java.io.*;

公共類 JavaTester{

公共靜態無效主要(字符串參數[]){

哈希表 ht=新哈希表();

ht.put(1,"Uday");

ht.put(1,"Ujjwal");

ht.put(2,"Sumit");

ht.put(3,”維杰”);

System.out.println(“————-哈希表————”);

Set<Integer> keySet = ht.keySet();

對於(整數鍵:keySet){

System.out.println(key + ” “+ht.get(key));

}

HashMap hm=new HashMap();

hm.put(0,"Uday");

hm.put(4,"Uday"); // 你可以在哈希圖中有重複的值

hm.put(1,”Sumit”);

hm.put(2,”維杰”);

System.out.println(“———–哈希圖———–“);

Set<Integer> keySet1 = ht.keySet();

對於(整數鍵:keySet){

System.out.println(key + ” “+hm.get(key));

}

}

}

輸出:

哈希表:

3 維杰

2 蘇米特

1 烏吉瓦爾

哈希圖:

0 烏代

1 頂峰

2維杰

4 烏代

何時使用 HashMap 與 HashTable?

決定是否使用 HashMap 或 HashTable 的主要因素是同步。 如果您需要線程安全的任務,那麼您應該使用 HashTable,因為它的所有方法都是同步的。 但是,它是一個遺留類,您應該避免使用它們。

如果您有一個多線程環境,您應該使用 ConcurrentHashMap,因為它與 HashTable 非常相似。 它允許您正確同步 HashMap。

同步操作會導致性能不佳,因此在大多數情況下應避免使用它們。 此外,HashMap 適合非線程環境,因此您可以輕鬆使用它。

從世界頂級大學在線學習軟件課程獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。

結論

HashMap 和 HashTable 是具有相似功能的流行 Java 代碼。 但是,如您所見,兩者之間存在一些顯著差異。 HashMap 是一個 Java 類,而 HashTable 是一個數據結構。

如果您有興趣了解有關 Java 和其他編程語言的更多信息,我們建議您查看我們的Executive PG Program in Software Development with Specialization in Full Stack Development

什麼是哈希表?

哈希表是一種在計算機編程中廣泛使用的容器數據結構。 哈希表用於保存鍵值對,其中鍵可以是任何對象。 作為一個容器,哈希表應該支持插入和刪除操作。 作為查找工具,哈希表應該支持get的操作。 如果一個哈希表應該是一個字典數據結構,它也應該支持包含的操作。 所以,總的來說,哈希表是一種被廣泛用於有效實現插入、刪除、獲取和包含操作的數據結構。 哈希表因其快速的性能而被廣泛使用。

Java 中的集合框架是什麼?

Java Collections Framework 是一組用於 Java 平台的接口、類和算法。 自 1.2 版以來,它一直是 Java 平台的一部分。 它包括容器、列表、隊列等的接口,但它還包括處理日期和時間的類、處理正則表達式的類、處理國際化的類以及處理文件搜索的類。

Java中的hashtable和hashmap之間有什麼關係?

哈希表是一種特殊的數據結構,它將鍵與值相關聯。 鍵可以是任何對象,但給定哈希表中的所有鍵必須彼此可比較(即,使用相同或兼容的接口)。 在 Java 中,映射是使用 TreeMap 實現的一種特定類型的哈希表。 map中的key必須實現equals方法,map使用這個方法判斷兩個key是否相等。 這意味著只有鍵存儲在映射中,並且在需要時計算它們的關聯值。