首頁>技術>

通常,對映是由一組鍵-值對組成的資料結構,每個鍵只能在對映中出現一次。

這篇文章總結了如何使用Java 對映及其實現類的部分常見問題。

為了簡單起見,將在示例中使用泛型。

因此,將只寫對映而不是特定的對映。

但是你總是可以假設K和V都是可比較的,這意味著K延伸了可比較的V延伸了可比較的。

1. 將對映轉換為列表

在Java中,對映介面提供了三個集合檢視:鍵集、值集和鍵值集。下面的程式碼片段展示了如何從對映構造ArrayList。

2. 在對映上迭代

遍歷每個鍵-值對是遍歷對映的最基本操作。

在Java中,這樣的對儲存在map條目map . entry中。

entryset()返回一個鍵值集,因此遍歷對映的每個條目的最有效方法是

迭代器也可以使用,尤其是在JDK 1.5之前

3. 在鍵上對對映進行排序

在鍵上對對映進行排序是另一種常見的操作。一種方法是放對映。

輸入到列表中,並使用排序值的比較器對其排序。

另一種方法是使用SortedMap,它進一步提供了鍵的總排序。

因此,所有鍵必須實現Comparable或被comparator接受。

SortedMap的一個實現類是TreeMap。

它的建構函式可以接受比較器。

下面的程式碼展示了如何將通用對映轉換為排序對映。

4. 在值上對對映排序

將對映放入列表並對其進行排序在本例中也適用,但是這次我們需要比較Entry.getValue()。

下面的程式碼幾乎和以前一樣。

對於這個問題,我們仍然可以使用排序後的對映,但前提是這些值也是唯一的。

在這種情況下,可以將鍵=值對反轉為值=鍵。

這個解決方案有很強的侷限性,所以不太推薦。

5. 初始化靜態/不可變對映

當您希望對映保持不變時,最好將其複製到不可變對映中。

這種防禦性程式設計技術不僅可以幫助您建立安全的執行緒對映,還可以幫助你建立安全的執行緒對映。

要初始化靜態/不可變對映,可以使用靜態初始化器(如下所示)。

這段程式碼的問題是,雖然對映被宣告為static final,但是我們仍然可以在初始化之後操作它,比如Test.map.put(3,"three")。因此,它並不是真的不可變。

要使用靜態初始化器建立不可變對映,我們需要一個額外的匿名類,並在初始化的最後一步將其複製到不可修改的對映中。

請看第二段程式碼。然後,如果你執行Test.map.put(3," 3 "),則會丟擲UnsupportedOperationException。

Guava libraries還支援以不同的方式初始化靜態和不可變的集合。

要了解更多關於Guava不可變集合實用程式的好處,請參閱Guava使用者指南中解釋的不可變集合。

6. HashMap、TreeMap和Hashtable之間的區別

Java中Map介面主要有三種實現:HashMap、TreeMap和Hashtable。

最重要的區別包括:

迭代的順序。

HashMap和Hashtable不保證對映的順序,

特別是,它們不能保證順序在一段時間內保持不變。

但TreeMap將根據鍵的“自然順序”或通過比較器迭代整個條目。

鍵-值許可。

HashMap允許空鍵和空值(只允許一個空鍵,因為不允許兩個鍵相同)。

Hashtable不允許空鍵或空值。

如果TreeMap使用自然排序或它的比較器不允許空鍵,則會丟擲異常。

只有Hashtable是同步的,其他的則不是。

因此,“如果不需要執行緒安全的實現,建議使用HashMap代替Hashtable。”

7. 具有反向檢視/查詢的對映

有時,我們需要一組鍵-鍵對,這意味著對映的值和鍵(一對一對映)是唯一的。

此約束允許建立對映的“反向查詢/檢視”。

我們可以通過鍵的值來查詢它。

這種資料結構稱為雙向對映,不幸的是JDK不支援這種結構。

Apache公共集合和Guava都提供了雙向對映的實現,分別稱為BidiMap和BiMap。

兩者都執行鍵和值之間存在1:1關係的限制。

java中對映的大多數實現(如果不是全部的話)都提供了另一個對映副本的建構函式。

但是複製過程不是同步的。

這意味著當一個執行緒複製對映時,另一個執行緒可能在結構上修改它。

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • iOS 生命週期的缺失和錯亂