Java 中的 HashMap、HashSet 和 Hashtable

Hiten Kanwar 2023年10月12日
  1. Java HashMap
  2. Java Hashtable
  3. Java HashSet
Java 中的 HashMap、HashSet 和 Hashtable

Java 的 Collection 介面為我們提供了各種介面和類來實現各種資料結構和演算法。

本教程將討論 Java 中的 HashMapHashSetHashtable

首先,讓我們瞭解一下一般的雜湊表是什麼。

我們可以使用雜湊表以鍵值對模式儲存元素,這意味著每個鍵都有一個與之關聯的值。鍵是用於索引值的唯一值。值是與相應鍵相關的資料。

雜湊表資料結構遵循雜湊的概念,其中使用鍵處理新索引。然後將與該鍵對應的元素儲存在索引中。這就是雜湊的概念。

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 介面。這通常在我們不需要將鍵對映到值對時使用。

HashSetHashtable 的不同之處在於 HashSet 不能儲存重複值。鍵值對是唯一的。就功能而言,HashSetHashMap 沒有任何共同之處,但它恰好在內部使用了 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]

相關文章 - Java HashMap

相關文章 - Java Hashtable