HashMap实现保存两个key相同的数据

网友投稿 312 2022-10-14


HashMap实现保存两个key相同的数据

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

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

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

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

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

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

测试1:

public static void main(String[] args) {

String str1 = "key";

String str2 = "key";

System.out.println(str1==str2);

Map map = new IdentityHashMap&lthttp://;&gthttp://;();

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:

public static void main(String[] args) {

String str1 = new String("key");

String str2 = new String("key");

System.out.println(str1==str2);

Map map = new IdentityHashMap<>();

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我也说不出个一二来;不过存在即合理,肯定有什么场景会用到的,后面遇到我会及时更新~

HashMap插入相同key

使用HashMap在插入操作时,会通过equal方法判断key是否相同。如果相同,则将覆盖对应的value;不相同才使用新的“桶”。

我的问题

当往HashMap中插入数据,即使有相同的key,但是能不能不进行覆盖操作,而是把新的value放在原有的value附近能够找到的位置?

想法

呃,其实大概方向就是通过一个HashMap实现。。。

贴上代码

import java.util.ArrayList;

import java.util.HashMap;

public class MapAndLink {

public static void main(String[] args){

HashMap map = new HashMap<>();

put(1, 1, map);

put(1, 3, map);

put(2, 2, map);

put(3, 4, map);

put(1, 3, map);

System.out.println(map.toString());

}

public static void put(Integer key, Integer str, HashMap map){

ArrayList list = map.get(key);

if(list == null)

list = new ArrayList();

for(int i = 0; i < list.size(); ++i){

if(list.get(i).equals(str))

return;

}

list.add(str);

map.put(key, list);

}

}

再贴上输出结果

{1=[1, 3], 2=[2], 3=[4]}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:TCP & UDP
下一篇:AliRTC QoS 屏幕共享弱网优化之若干编码器相关优化
相关文章

 发表评论

暂时没有评论,来抢沙发吧~