Java IdentityHashMap v get(key)方法在以下情况下如何工作
从以下文件的javadoc: 此类使用哈希表实现映射接口,使用 比较键时引用相等,而不是对象相等 (和价值观)。换句话说,在IdentityHashMap中,两个键k1和 k2被认为是相等的当且仅当(k1==k2)。(在法线贴图中) 实现(如HashMap)两个键k1和k2被认为是相等的 当且仅当(k1==null?k2==null:k1.equals(k2)))Java IdentityHashMap v get(key)方法在以下情况下如何工作,java,collections,concurrency,Java,Collections,Concurrency,从以下文件的javadoc: 此类使用哈希表实现映射接口,使用 比较键时引用相等,而不是对象相等 (和价值观)。换句话说,在IdentityHashMap中,两个键k1和 k2被认为是相等的当且仅当(k1==k2)。(在法线贴图中) 实现(如HashMap)两个键k1和k2被认为是相等的 当且仅当(k1==null?k2==null:k1.equals(k2))) 所以,如果您尝试使用插入值的同一个键引用检索值,您将获得该值。但是,如果您尝试使用差分键引用获取值(即使它相等),您将得到空值。对于
所以,如果您尝试使用插入值的同一个键引用检索值,您将获得该值。但是,如果您尝试使用差分键引用获取值(即使它相等),您将得到空值。对于IdentityHashMap使用“==”运算符比较键,而在HashMap中则使用equals()进行比较。 当您创建一个新字符串(“键”)时,它总是在中创建一个新对象 堆内存 。另一方面,如果您使用字符串文字语法(例如“key”)创建对象,它可能会从 串池 或者在池中创建一个。
因此,使用equals()时,两者都与比较内容相同,但“==”将比较两种情况下不同的引用(因此,如果使用IdentityHashMap,则无法获取对象) 欢迎来到堆栈溢出。请花些时间重新格式化您的代码-使用预览检查它是否以您期望的方式显示-并将您的描述置于代码之外。您期望的是什么<代码>新字符串(“identityKey”)!=“identityKey”。
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"));
}
}