Java IdentityHashMap類的用法 | baeldung
在本教程中,我們將學習如何在 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確保再次檢索到相同的文字。由於引用是相等的,這是有可能的。
它對構建特定的框架很有幫助,包括。
- 為一組易變的物件維護代理物件
- 基於一個物件的引用建立一個快速快取
- 保持一個有引用的物件的記憶體圖
相關文章
- Java基礎--HashMap IdentityHashMap與WeakHashMapJavaHashMapIDE
- IdentityHashMapIDEHashMap
- Java裡的Character類的基本用法Java
- Java的特殊類用法:檔案類、內部類、本地類、匿名類Java
- Java內部類和匿名內部類的用法Java
- java SequenceInputStream類(序列輸入流)的用法示例Java
- 如何找到JAVA_HOME | BaeldungJava
- IdentityHashMap vs HashMapIDEHashMap
- Java AES加密和解密教程 - BaeldungJava加密解密
- Java 時間類 Date、Calendar 及用法Java
- Java Optional的orElse()與orElseGet()兩個方法比較 - BaeldungJava
- Java中的Exception拋異常對效能的影響 - BaeldungJavaException
- 【JAVA :File類的用法(一)】File類的構造方法-File類建立檔案與資料夾Java構造方法
- Java enum列舉類詳解 列舉的常見用法Java
- Java語言class類用法及泛化(詳解)Java
- java Properties的用法Java
- Java中實現執行緒安全HashSet的幾種方法 | baeldungJava執行緒
- Android 中的DisplayMetrics類的用法Android
- Java中super的用法Java
- Java中DecimalFormat的用法JavaDecimalORM
- java和redies的用法Java
- java中filter的用法JavaFilter
- java中switch的用法Java
- java中Scanner的用法。Java
- java ObjectIn/OutStream的用法JavaObject
- JAVA中...的特殊用法。Java
- Java之中的Vector的用法Java
- Java中幾個常用併發佇列比較 | BaeldungJava佇列
- Java NIO和NIO.2有什麼區別? | baeldungJava
- Axon框架指南 - Baeldung框架
- Lotus 公式用法歸類公式
- Guava Preconditions類的各種用法Guava
- IOS幾個常用類庫的用法iOS
- 類别範本的常見用法
- Java 列舉 switch的用法Java
- java——split的用法(字串拆分)Java字串
- java繼承-super的用法Java繼承
- JAVA中subString的用法Java