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<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:
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>实现。。。
贴上代码
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.String());
}
public static void put(Integer key, Integer str, HashMap<Integer, ArrayList> map){
ArrayList<Integer> list = (key);
if(list == null)
list = new ArrayList();
for(int i = 0; i < list.size(); ++i){
(i).equals(str))
return;
}
list.add(str);
map.put(key, list);
字符串常量池存的是实例还是引用?
}
}
再贴上输出结果
{1=[1, 3], 2=[2], 3=[4]}
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。