當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java HashMap和IdentityHashMap的區別用法及代碼示例


java中的HashMap 是一個類,是java集合的一部分。它實現了java的Map接口。它以鍵和值對的形式存儲數據。鍵應該是唯一的,但值可以重複。如果您嘗試插入重複的鍵,它將替換相應鍵的元素。 HashMap與哈希表類似,但它是不同步的。它允許存儲空鍵和空值,但應該隻有一個空鍵,並且可以有任意數量的空值。

IdentityHashMap實施Map接口。比較鍵(和值)時,它遵循 reference-equality 代替 object-equality。當用戶需要通過引用比較對象時使用該類。它不同步,必須外部同步。這個類中的迭代器是fail-fast,拋出ConcurrentModificationException 嘗試在迭代時進行修改。

HashMap 和IdentityHashMap 都是實現Map 接口的類。但它們之間幾乎沒有什麽區別。

示例 1:HashMap

Java


// Java program to illustrate 
// the working of Java HashMap 
// to demonstrate 
// internal working difference between them 
  
// Importing HashMap class from 
// java.util package 
import java.util.HashMap; 
  
// Class 
public class GFG { 
  
    // Main driver method 
    public static void main(String[] args) 
    { 
        // Creating an empty HashMap object 
        HashMap<Integer, String> map = new HashMap<>(); 
  
        // Add elements to the map 
        // Custom inputs 
        map.put(10, "Geeks"); 
        map.put(20, "for"); 
        map.put(30, "geeks"); 
        map.put(40, "welcome"); 
        map.put(50, "you"); 
  
        // Printing the size of map 
        System.out.println("Size of map is:- "
                           + map.size()); 
  
        // Printing the HashMap content 
        System.out.println("HashMap content: " + map); 
  
        // Removing a key 50 
        map.remove(50); 
  
        // Printing the HashMap after the removal 
        System.out.println("HashMap after removal : "
                           + map); 
    } 
}
輸出
Size of map is:- 5
HashMap content: {50=you, 20=for, 40=welcome, 10=Geeks, 30=geeks}
HashMap after removal : {20=for, 40=welcome, 10=Geeks, 30=geeks}

示例 2:IdentityHashMap

Java


// Java program to illustrate 
// working of IdentityHashmap 
// to demonstrate 
// internal working difference between them 
  
// Importing all classes of 
// java.util package 
import java.util.*; 
  
// Class for iterating IdentityHashMap 
public class GFG { 
  
    // Main driver method 
    public static void main(String[] args) 
    { 
  
        // Creating an empty IdentityHashMap object 
        IdentityHashMap<Integer, String> ihmap 
            = new IdentityHashMap<Integer, String>(); 
  
        // Mapping string values to int keys 
        // Custom inputs --> Custom mappings 
        ihmap.put(10, "Geeks"); 
        ihmap.put(20, "for"); 
        ihmap.put(30, "Geeks"); 
        ihmap.put(40, "Welcomes"); 
        ihmap.put(50, "You"); 
  
        // Display the size of IdentityHashMap 
        System.out.println("IdentityHashMap size : "
                           + ihmap.size()); 
  
        // Display the IdentityHashMap 
        System.out.println("Initial identity hash map: "
                           + ihmap); 
  
        // Create an Iterator over the IdentityHashMap 
        Iterator<IdentityHashMap.Entry<Integer, String> > 
            itr = ihmap.entrySet().iterator(); 
  
        // Condition check using hasNext() method() 
  
        // Condition check using hasNext() method holding 
        // true if there is any next element remaining 
        while (itr.hasNext()) { 
  
            // next() method which is used to 
            // retrieve the next element 
            IdentityHashMap.Entry<Integer, String> entry 
                = itr.next(); 
  
            // Print and display key and value pairs 
            // using getKey() method 
            System.out.println("Key = " + entry.getKey() 
                               + ", Value = "
                               + entry.getValue()); 
        } 
    } 
}
輸出
IdentityHashMap size : 5
Initial identity hash map: {10=Geeks, 40=Welcomes, 50=You, 30=Geeks, 20=for}
Key = 10, Value = Geeks
Key = 40, Value = Welcomes
Key = 50, Value = You
Key = 30, Value = Geeks
Key = 20, Value = for

Difference between HashMap and IdentityHashMap in Java

S.NO. HashMap 身份哈希映射
1. HashMap實現了Map接口,但並不違反Map通用契約。 IdentityHashMap也實現了Map接口,但它故意違反了Map通用契約。
2. HashMap 使用對象相等性來比較鍵和值。 IdentityHashMap 使用引用相等來比較鍵和值。
3. HashMap使用HashMap類的hashCode()方法來查找存儲桶位置。 IdentityHashMap 不使用 hashCode() 方法,而是使用 System.IdentityHashCode() 方法來查找存儲桶位置。
4. HashMap 使用鏈接。 IdentityHashMap 使用a 簡單線性探測哈希表。
5. 為了安全地將對象存儲在HashMap中, key 需要是不可變的。 IdentityHashMap 不要求 key 不可變。
6. HashMap 的性能略低於 IdentityHashMap。 IdentityHashMap 比 HashMap 性能更好。


相關用法


注:本文由純淨天空篩選整理自prashant_srivastava大神的英文原創作品 Difference between HashMap and IdentityHashMap in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。