Java IdentityHashMap類的用法 | baeldung

banq發表於2022-02-07

在本教程中,我們將學習如何在 Java中使用IdentityHashMap類。我們還將研究它與一般的HashMap類有何不同。雖然這個類實現了Map介面,但它違反了Map介面的約定。
IdentityHashMap類。
Java IdentityHashMap類實現了Map介面。Map介面強制要求在鍵的比較上使用equals()方法。然而,IdentityHashMap類違反了這個契約。相反,它在鍵的搜尋操作上使用引用相等(==)。
在搜尋操作中,HashMap使用hashCode()方法進行雜湊雜湊,而IdentityHashMap使用System.identHashCode()方法。它還使用了雜湊圖的線性探測技術進行搜尋操作。

引用相等、System.identityHashCode()和線性探測技術的使用使IdentityHashMap類具有更好的效能。

使用程式碼:

IdentityHashMap<String, String> identityHashMap = new IdentityHashMap<>();
identityHashMap.put("title", "Harry Potter and the Goblet of Fire");
identityHashMap.put("author", "J. K. Rowling");
identityHashMap.put("language", "English");
identityHashMap.put("genre", "Fantasy");


String value = identityHashMap.get(key);



我們也有不同的方法可用,其工作原理與其他地圖物件類似。
  • clear(): 刪除所有條目
  • containsKey(): 查詢一個鍵是否存在於地圖中,根據引用是否等同。
  • containsValue(): 查詢值是否存在於地圖中,根據引用是否等同。
  • keySet():返回一個基於identity的鍵集。
  • size(): 返回條目的數量
  • values():返回一個值的集合


 
IdentityHashMap並不是執行緒安全的,和HashMap一樣。因此,如果我們有多個執行緒並行地訪問/修改IdentityHashMap條目,我們應該將它們轉換為同步map。

我們可以使用Collections類得到一個同步map。

Map<String, String> synchronizedMap = Collections.synchronizedMap(new IdentityHashMap<String, String>());



 
IdentityHashMap在equals()方法上使用引用是否相等(==)來搜尋/儲存/訪問金鑰物件。

HashMap<String, String> hashMap = new HashMap<>(identityHashMap);
hashMap.put(new String("genre"), "Drama");
assertEquals(4, hashMap.size());


當使用一個新的字串物件 "genre "作為鍵時,HashMap將其等同於現有的鍵並更新其值。因此,Map的大小仍然是4。

下面的程式碼片斷顯示了IdentityHashMap的不同:

identityHashMap.put(new String("genre"), "Drama");
assertEquals(5, identityHashMap.size());

IdentityHashMap認為新的 "genre "字串物件是一個新的鍵。
因此,它斷定大小為5。兩個不同的 "genre "物件被用作兩個鍵。
 
 
IdentityHashMap允許可變鍵。這是該類的另一個有用的特性。

這裡我們將把一個簡單的Book類作為一個可變的物件。

class Book {
    String title;
    int year;
    
    // other methods including equals, hashCode and toString
}

首先,建立了兩個Book類的可變物件。

Book book1 = new Book("A Passage to India", 1924);
Book book2 = new Book("Invisible Man", 1953);


下面是 IdentityHashMap:

IdentityHashMap<Book, String> identityHashMap = new IdentityHashMap<>(10);
identityHashMap.put(book1, "A great work of fiction");
identityHashMap.put(book2, "won the US National Book Award");
book2.year = 1951;
assertEquals("won the US National Book Award", identityHashMap.get(book2));


即使鍵物件被修改,IdentityHashMap也能檢索到值。在上面的程式碼中,assertEquals確保再次檢索到相同的文字。由於引用是相等的,這是有可能的。
 
它對構建特定的框架很有幫助,包括。
  • 為一組易變的物件維護代理物件
  • 基於一個物件的引用建立一個快速快取
  • 保持一個有引用的物件的記憶體圖


 

相關文章