import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;
public class IdentityHashMapExample {
public static void main(String args[]){
// Created HashMap and IdentityHashMap objects
Map hashmapObject = new HashMap();
Map identityObject = new IdentityHashMap();
// Putting keys and values in HashMap and IdentityHashMap Object
hashmapObject.put(new String("key") ,"Google");
hashmapObject.put(new String("key") ,"Facebook");
identityObject.put(new String("identityKey") ,"Google");
identityObject.put(new String("identityKey") ,"Facebook");
// Print HashMap and IdentityHashMap Size : After adding keys
System.out.println("HashMap after adding key :"+ hashmapObject);
System.out.println("Getting value from HashMap :"+ hashmapObject.get("key"));
System.out.println("IdentityHashMap after adding key :"+ identityObject);
// why get(key) method return the null value in case of identityHash Map
System.out.println("Getting value from IdentityHashMap :" + identityObject.get("identityKey"));
}
}
答案 0 :(得分:1)
来自IdentityHashMap的javadoc:
该类使用哈希表实现Map接口 比较键时,引用相等性代替对象相等 (和价值观)。换句话说,在IdentityHashMap中,有两个键k1和 当且仅当(k1 == k2)时,k2被认为是相等的。 (在普通地图中 实现(如HashMap)两个密钥k1和k2被认为是相等的 if和only if(k1 == null?k2 == null:k1.equals(k2))。)
因此,如果您尝试使用插入了值的相同键引用来检索值,您将获得该值。但是如果你尝试使用差异键引用来获取值(即使它是相等的),你将得到null。
答案 1 :(得分:0)
对于 IdentityHashMap ,使用' =='来比较密钥。运算符,而在 HashMap 中,它使用equals()完成。 当你执行一个新的String(" key")时,它总是在
中创建一个新对象堆内存
。另一方面,如果使用String文字语法创建对象,例如" key",它可以从
返回现有对象字符串池
或在池中创建一个。 因此,使用equals()两者都与比较内容相同,但是' =='将比较两种情况下不同的引用(因此,在IdentityHashMap的情况下,您无法获取对象)。