HashMap如何保存两个key相同的数据
最近一个朋友去面试了,面试官问了一个关于HashMap的问题:HashMap如何保存两个key相同的数据?
准确来说,应该是Map中如何保存两个key相同的数据,因为用来实现这个功能的IdentityHashMap类和HashMap虽然都是实现了Map接口,但本质是属于不同的东西;
我们知道在HashMap中,如果key相同就会被覆盖,那IdentityHashMap是怎么实现这个功能的呢?
java jdk源码中,IdentityHashMap类上写了100来行注释的代码,如果用一句话来总结的话:
IdentityhashMap类利用哈希表实现Map接口,比较键(和值)时使用引用相等性代替对象相等性,也就是说key(value)比较的时候只比较两个key是否引用同一个对象,比较的是对象的地址;
测试1:
1
2
3
4
5
6
7
8
9
|
public static void main(String[] args) { String str1 = "key" ; String str2 = "key" ; System.out.println(str1==str2); Map<String, String> map = new IdentityHashMap<>(); 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:
1
2
3
4
5
6
7
8
9
|
public static void main(String[] args) { String str1 = new String( "key" ); String str2 = new String( "key" ); System.out.println(str1==str2); Map<String, String> 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<Integer, ArrayList>实现。。。
贴上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import java.util.ArrayList; import java.util.HashMap; public class MapAndLink { public static void main(String[] args){ HashMap<Integer, ArrayList> 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<Integer, ArrayList> map){ ArrayList<Integer> 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]}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_33732195/article/details/108121285