在Map中实现key唯一不重复操作
map中如何实现key唯一不重复
问题:如何做到map中key唯一不重复,每次都遍历来equals比较吗?
首先,答案是否。如果全部遍历的话,当map中元素很多的时候,显然查询效率低。
解释: hashmap属于散列存储结构,其table的存储是放在不同的jvm内存区域。通过一个整型值来标识table的区域,相当于这个区域的下标。然后整个查找过程就从不再需要遍历整个table,只需遍历这一区域的数据即可。
结合hashmap.class中的put方法来说明:
如何找到这个区域呢?
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,继续研究。。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 那就用钻石吧