HashMap如何保存两个key相同的数据

2022-07-31 11:39:41

HashMap如何保存两个key相同的数据

最近一个朋友去面试了,面试官问了一个关于HashMap的问题:HashMap如何保存两个key相同的数据?

准确来说,应该是Map中如何保存两个key相同的数据,因为用来实现这个功能的IdentityHashMap类和HashMap虽然都是实现了Map接口,但本质是属于不同的东西;

我们知道在HashMap中,如果key相同就会被覆盖,那IdentityHashMap是怎么实现这个功能的呢?

java jdk源码中,IdentityHashMap类上写了100来行注释的代码,如果用一句话来总结的话:

IdentityhashMap类利用哈希表实现Map接口,比较键(和值)时使用引用相等性代替对象相等性,也就是说key(value)比较的时候只比较两个key是否引用同一个对象,比较的是对象的地址;

测试1:

publicstaticvoidmain(String[] args){
    String str1="key";
    String str2="key";
    System.out.println(str1==str2);
    Map<String, String> map=newIdentityHashMap<>();
    map.put(str1,"value1");
    map.put(str2,"value2");
    map.forEach((k,v)-> System.out.println(k+"->"+v));}
打印:true
    key->value2

测试1中,将字符串"key"直接赋值给str1和str2,因为字符串是放在常量池中的,所以str1和str2实际上还是同一个对象,所以它们的key值是相同的,会被覆盖;

测试2:

publicstaticvoidmain(String[] args){
    String str1=newString("key");
    String str2=newString("key");
    System.out.println(str1==str2);
    Map<String, String> map=newIdentityHashMap<>();
    map.put(str1,"value1");
    map.put(str2,"value2");
    map.forEach((k,v)-> System.out.println(k+"->"+v));}

打印:false
    key  value1
	key  value2

测试2中,str1和str2是通过new的方式创建出来的,属于不同对象,所以它们的引用不同,key值也就不同,所以put的时候不会被覆盖;

关于IdentityHashMap常不常用,实际开发中我基本没用过,所以在什么场景会用到IdentityHashMap我也说不出个一二来;不过存在即合理,肯定有什么场景会用到的,后面遇到我会及时更新~

参考:https://blog.csdn.net/weixin_37774620/article/details/79128212

  • 作者:Bee.F
  • 原文链接:https://blog.csdn.net/qq_33732195/article/details/108121285
    更新时间:2022-07-31 11:39:41