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是否相等。 這意味著只有鍵存儲在映射中,並且在需要時計算它們的關聯值。