温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

在Map中如何实现key唯一不重复操作

发布时间:2021-08-30 09:34:16 来源:亿速云 阅读:293 作者:小新 栏目:开发技术

这篇文章主要介绍了在Map中如何实现key唯一不重复操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

问题:如何做到Map中key唯一不重复,每次都遍历来equals比较吗?

首先,答案是否。如果全部遍历的话,当Map中元素很多的时候,显然查询效率低。

解释: HashMap属于散列存储结构,其table的存储是放在不同的Jvm内存区域。通过一个整型值来标识table的区域,相当于这个区域的下标。然后整个查找过程就从不再需要遍历整个table,只需遍历这一区域的数据即可。

结合HashMap.class中的put方法来说明:

在Map中如何实现key唯一不重复操作

如何找到这个区域呢?

1.首先将传入的key值用hash方法转化为int型的hash值,并且通过该方法让hash值变得各位更均匀一些。变得更均匀的目的是让每一个区域的大小更加等分些,公平利用存储空间,查询速度得到提升。

2.而后的indexfor方法将根据其hash值和table的大小得到这个区域的“位置下标”。具体其方法的实现同样也是为了让各个区域分布的更加均匀。

得到这个区域以后,再遍历这个区域来找到对应的元素

1.通过for循环遍历这个区域的链表,在循环中如果key值的hash值相等,并且其key值相等,那么进行覆盖原元素操作。

2.如果遍历结束依然没找到,则新添元素

Map放入相同的key值

因为Map本身是不可以放相同的key的,但是如果我们想,也是有办法的。

另外java也给我们提供了一个钻空子的方法,这就是JDK1.8的IdentityHashMap,也是Map的一个实现类

HashMap比较key的值是用equals来比较的,所以只要key的值一样,就会被认为是同一个key。而IdentityHashMap是用==来比较key的存放地址,所以,只要我们重新new出来一个对象,就可以把值相同的key定义为值相等但地址不相同的key,这样就不会被认为是同一个key

public class MapTest { 
 public static void main(String[] args) {
  Map map = new IdentityHashMap();  
  map.put(new Integer(1), "tom");
  map.put(new Integer(1), "ben");
  map.put(new Integer(1), "cat");
  map.put(new Integer(1), "dog");  
  System.out.println(map);
 }
}

输出结果是:

{1=tom, 1=dog, 1=cat, 1=ben}

另外HashMap还可以自己重写hashCode和put来实现hashCode的值不一样,从而不会被认为是同一个key。

感谢你能够认真阅读完这篇文章,希望小编分享的“在Map中如何实现key唯一不重复操作”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI