在Map中实现key唯⼀不重复操作
⽬录
Map中如何实现key唯⼀不重复
问题:如何做到Map中key唯⼀不重复,每次都遍历来equals⽐较吗?
结合HashMap.class中的put⽅法来说明:
如何到这个区域呢?
得到这个区域以后,再遍历这个区域来到对应的元素
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值相等,那么进⾏覆盖原元素操作。equals不等于
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,继续研究。。以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论