HashMap 和 Hashtable 將鍵值對存儲在哈希表中。使用 Hashtable 或 HashMap 時,我們指定一個用作鍵的對象以及要鏈接到該鍵的值。然後對鍵進行哈希處理,得到的哈希碼用作表中存儲值的索引。現在讓我們通過一個例子來討論。
哈希圖與哈希表
- HashMap 不同步。它不是線程安全的,如果沒有正確的同步代碼,就不能在多個線程之間共享,而 Hashtable 是同步的。它是線程安全的,可以與多個線程共享。
- HashMap 允許一個空鍵和多個空值,而 Hashtable 不允許任何空鍵或值。
- 如果不需要線程同步,則 HashMap 通常優於 HashTable。
Difference Between Hashmap and Hashtable
S. 編號 | 哈希圖 | 哈希表 |
---|---|---|
1. | 沒有方法被同步。 | 每個方法都是同步的。 |
2. | 多個線程可以同時操作,因此 hashmap 的對象不是線程安全的。 | 同一時刻隻允許一個線程操作 Hashtable 的對象。因此它是線程安全的。 |
3. | 線程不需要等待,因此性能相對較高。 | 它增加了線程的等待時間,因此性能較低。 |
4. | 鍵和值都允許為 Null。 | 鍵和值都不允許為 Null。否則,我們將得到一個 NullPointerException 。 |
5. | 它是在1.2版本中引入的。 | 它是在1.0版本中引入的。 |
6. | 它是非遺產。 | 這是一個遺產。 |
現在你一定想知道為什麽 HashTable 不允許 null 而 HashMap 允許?
答案很簡單。為了成功地在 HashTable 中存儲和檢索對象,用作鍵的對象必須實現 hashCode 方法和 equals 方法。由於 null 不是對象,因此它無法實現這些方法。 HashMap是Hashtable的高級版本和改進。 HashMap是後來創建的。
例子:
Java
// Java program to demonstrate
// HashMap and HashTable
import java.util.*;
import java.lang.*;
import java.io.*;
// Name of the class has to be "Main"
// only if the class is public
class Ideone
{
public static void main(String args[])
{
//----------hashtable -------------------------
Hashtable<Integer,String> ht=new Hashtable<Integer,String>();
ht.put(101," ajay");
ht.put(101,"Vijay");
ht.put(102,"Ravi");
ht.put(103,"Rahul");
System.out.println("-------------Hash table--------------");
for (Map.Entry m:ht.entrySet()) {
System.out.println(m.getKey()+" "+m.getValue());
}
//----------------hashmap--------------------------------
HashMap<Integer,String> hm=new HashMap<Integer,String>();
hm.put(100,"Amit");
hm.put(104,"Amit");
hm.put(101,"Vijay");
hm.put(102,"Rahul");
System.out.println("-----------Hash map-----------");
for (Map.Entry m:hm.entrySet()) {
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
輸出
-------------Hash table-------------- 103 Rahul 102 Ravi 101 Vijay -----------Hash map----------- 100 Amit 101 Vijay 102 Rahul 104 Amit
本文由 Aditya Goel 編譯。
相關用法
- Java HashMap和IdentityHashMap的區別用法及代碼示例
- Java HashMap clear()用法及代碼示例
- Java HashMap clone()用法及代碼示例
- Java HashMap isEmpty()用法及代碼示例
- Java HashMap size()用法及代碼示例
- Java HashMap put()用法及代碼示例
- Java HashMap putAll()用法及代碼示例
- Java HashMap putIfAbsent()用法及代碼示例
- Java HashMap remove()用法及代碼示例
- Java HashMap containsKey()用法及代碼示例
- Java HashMap containsValue()用法及代碼示例
- Java HashMap replace()用法及代碼示例
- Java HashMap replaceAll()用法及代碼示例
- Java HashMap get()用法及代碼示例
- Java HashMap getOrDefault()用法及代碼示例
- Java HashMap forEach()用法及代碼示例
- Java HashMap entrySet()用法及代碼示例
- Java HashMap keySet()用法及代碼示例
- Java HashMap values()用法及代碼示例
- Java HashMap merge()用法及代碼示例
- Java HashMap compute()用法及代碼示例
- Java HashMap computeIfAbsent()用法及代碼示例
- Java HashMap computeIfPresent()用法及代碼示例
- Java HashMap forEach(BiConsumer)用法及代碼示例
- Java HashMap replaceAll(BiFunction)用法及代碼示例
注:本文由純淨天空篩選整理自佚名大神的英文原創作品 Differences between HashMap and HashTable in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。