Java 中 HashMap 和字典的區別
1. 概述
Java 開發人員在使用鍵值對資料結構時經常會遇到HashMap
和Dictionary
。乍一看,它們似乎可以互換,但它們在設計、效能以及與現代 Java 實踐的兼容性方面存在顯著差異。
在本教程中,我們將深入探討這些差異,並清楚地解釋何時以及為何使用它們。
2. 簡介
我們先簡單介紹一下HashMap
和Dictionary
。
2.1. HashMap
HashMap
是在 Java 2 中引入的。 HashMap
支援null
鍵和值,使其適用於現代應用程式。我們將在後面的部分中了解更多相關資訊。
2.2. Dictionary
Dictionary
是 Java 1.0 的遺物,是用來鍵值對儲存的抽象類別。雖然它為早期 Java 程式提供了基礎,但現在它被認為已經過時,並且很少在遺留系統之外使用。它不與集合框架集成,並且缺乏泛型等現代功能。
3. 空值處理
最顯著的差異之一是它們處理null
值的方式。開發人員通常會遇到NullPointerException
,因此使用 Java 中的一些概念來處理它很重要。那麼,讓我們看看HashMap
和Dictionary
在處理NullPointerException
如何發揮作用。
3.1. HashMap
HashMap
中可以有一個null
鍵和多個null
值。此函數適合需要表示缺失值或未定義值的情況。
讓我們看看如何:
HashMap<String, String> map = new HashMap<>();
map.put(null, "NullKeyValue");
map.put("Key1", null);
3.2. Dictionary
Dictionary
中不允許使用 Null 鍵和 null 值,因為當我們嘗試插入它們時,大多數實作(如Hashtable
)都會拋出NullPointerException
。
讓我們看看如何:
Dictionary<String, String> dictionary = new Hashtable<>();
dictionary.put(null, "NullKey");
這裡,程式碼dictionary.put(null, “NullKey”)
會拋出NullPointerException,所以我們不應該在可能遇到null
鍵或值a NullPointerException,
地方使用Dictionary
。
4. 線程安全
處理多執行緒時,線程安全性是另一個重要概念。在本節中,我們將探討HashMap
和Dictionary
行為方式。
4.1. HashMap
HashMap
預設是不同步的,在單執行緒場景下速度更快。如果我們需要線程安全,我們包裝它的第一種方法是使用Collections.synchronizedMap()
:
Map<String, String> synchronizedMap = Collections.synchronizedMap(new HashMap<>());
另一種方法是使用ConcurrentHashMap
,它提供了一種線程安全的替代方案,在並發環境中具有更好的效能。
4.2. Dictionary
預設情況下, Dictionary
是同步的,但這會帶來效能成本。對於現代多線程應用程序, ConcurrentHashMap
是更好的選擇。
5. 通用支持
5.1. HashMap
HashMap
完全支援泛型,這使其類型安全並消除了明確轉換的需要。此功能減少了運行時錯誤並提高了程式碼可讀性。
讓我們看看如何將HashMap
與泛型一起使用:
Map<Integer, String> map = new HashMap<>();
map.put(1, "One");
String value = map.get(1);
無需進行轉換即可取得HashMap
的值。
5.2. Dictionary
Dictionary
缺乏泛型,因為它早於 Java 5 中引入泛型。每次我們檢索一個值時,我們都必須明確地轉換它,從而增加了運行時錯誤的可能性。
讓我們來看一個例子:
Dictionary dictionary = new Hashtable();
dictionary.put(1, "One");
String value = (String) dictionary.get(1);
因此,如上面的程式碼所示,我們需要明確轉換資料類型以從Dictionary
取得值。
六、結論
在本文中,我們看到,在HashMap
和Dictionary
之間,現代 Java 開發有一個明顯的贏家: HashMap
。它更快、更靈活,並提供更好的功能,例如泛型和對空值的支援。
雖然Dictionary
在 Java 的歷史中佔有一席之地,但最好還是讓它留在過去,除非我們正在使用舊的程式碼庫。下次我們需要選擇一個鍵值對資料結構時,我們就知道該選擇哪一個了!
與往常一樣,本文中提供的程式碼可以在 GitHub 上取得。