Java 中的 HashMap、HashSet 和 Hashtable
Java 的 Collection
介面為我們提供了各種介面和類來實現各種資料結構和演算法。
本教程將討論 Java 中的 HashMap
、HashSet
和 Hashtable
。
首先,讓我們瞭解一下一般的雜湊表是什麼。
我們可以使用雜湊表以鍵值對模式儲存元素,這意味著每個鍵都有一個與之關聯的值。鍵是用於索引值的唯一值。值是與相應鍵相關的資料。
雜湊表資料結構遵循雜湊的概念,其中使用鍵處理新索引。然後將與該鍵對應的元素儲存在索引中。這就是雜湊的概念。
讓 h(x)
是雜湊函式,而 k
是一個鍵,那麼 h(k)
將給出一個新的索引來儲存與 k
連結的元素。
Java HashMap
HashMap
是一類 Java 的集合框架,它為我們提供了雜湊表資料結構。它將元素儲存為鍵值對,其中鍵是對映上與特定值配對的唯一識別符號。HashMap
類實現了 Map 介面,它進一步擴充套件了 Collections 介面。
HashMap
是不同步的,這意味著它不是執行緒安全的。我們可以使用多個執行緒訪問它並同時修改它。它可以在外部成為執行緒安全的。
HashMap
的另一個特點是它可以儲存一個空的鍵或值對。
例如,
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> h = new HashMap<>();
h.put("One", 1);
h.put("Two", 2);
h.put("Three", 3);
System.out.println(h);
}
}
輸出:
HashMap: {One=1, Two=2, Three=3}
Java Hashtable
Java 的 Hashtable
類實現了雜湊表資料結構。與 HashMap
類似,它也將元素儲存為鍵值對。但它與 HashMap
不同,因為它是同步的。它將鍵值對儲存在雜湊表中。它實現了 Map 介面。
首先,在 Hashtable
中,我們將物件指定為鍵,並將其值作為一對。然後對鍵進行雜湊,然後我們將得到的雜湊碼用作儲存在表中的值的索引。
因此,與 Hashtable
相關的問題是同步每個方法呼叫相對而言不是無關緊要的。不是每次都需要。因此,為了克服這個問題,集合框架的作者提出了一個名為 HashMap
(它還闡明它對映元素)的新類,它是非同步的。
如果不想使用方法級同步,可以跳過 Hashtable
並使用 Collections.synchronizedMap()
將 Map 轉換為同步 Map。或者,我們可以使用 ConcurrentHashMap
,根據其文件,它提供與 Hashtable
相同的功能,但具有更好的效能和一些附加功能。
例如,
import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[])
{
Hashtable<Integer, String> h = new Hashtable<>();
h.put(1, "one");
h.put(2, "two");
h.put(3, "three");
System.out.println(h);
}
}
輸出:
{3=three, 2=two, 1=one}
Java HashSet
HashSet
是一類 Java 的集合框架,它為我們提供了雜湊表資料結構的實現(就像 HashMap
)。儘管如此,它還是實現了 Set
介面(與 HashMap
不同),它進一步擴充套件了 Collections 介面。這通常在我們不需要將鍵對映到值對時使用。
HashSet
與 Hashtable
的不同之處在於 HashSet
不能儲存重複值。鍵值對是唯一的。就功能而言,HashSet
與 HashMap
沒有任何共同之處,但它恰好在內部使用了 HashMap
來實現 Set 介面。
例如,
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<Integer> h = new HashSet<>();
h.add(5);
h.add(10);
h.add(15);
System.out.println(h);
}
}
輸出:
[5, 10, 15]