IdentityHashMap v get(key)方法如何在以下情况下工作

时间:2016-04-12 17:34:12

标签: java collections concurrency

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"));
    }
}

2 个答案:

答案 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的情况下,您无法获取对象)。