在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,继续研究。。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
Map获取键值,Map的几种遍历方法总结(推荐)
Map获取键值 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map---实现Map Map.Entry--Map的内部类,描述Map中的按键/数值对. SortedMap---扩展Map,使按键保持升序排列 关于怎么使用,一般是选择Map的子类,而不直接用Map类. 下面以HashMap为例 public static void main(String args[]) { HashMap hashmap =new HashMap();
-
Java中List根据map的某个key去重的代码
话不多说,看代码和效果 /** * 根据map中的某个key 去除List中重复的map * @author shijing * @param list * @param mapKey * @return */ public static List<Map<String, Object>> removeRepeatMapByKey(List<Map<String, Object>> list, String mapKey){ if (CollectionUt
-
Java中的Map允许有重复元素吗?
Java中常见的三个集合接口:List.Set.Map,已经知道List中是允许有重复元素的,而Set中是不允许有重复元素的,那么Map中允许有重复元素吗? 查阅资料,发现是不可以的,因为map是无序的,它的查询需要通过key的值来查找,如果你定义两个同样的key,那么一个key就对应了多个值,这样就违背了java对map的定义,键和值是一一对应的.所以key不可以重复. 写个代码测试一下: package com.test.collection; import java.util.HashMa
-
HashMap实现保存两个key相同的数据
HashMap如何保存两个key相同的数据 最近一个朋友去面试了,面试官问了一个关于HashMap的问题:HashMap如何保存两个key相同的数据? 准确来说,应该是Map中如何保存两个key相同的数据,因为用来实现这个功能的IdentityHashMap类和HashMap虽然都是实现了Map接口,但本质是属于不同的东西: 我们知道在HashMap中,如果key相同就会被覆盖,那IdentityHashMap是怎么实现这个功能的呢? java jdk源码中,IdentityHashMap类上写
-
在Map中实现key唯一不重复操作
Map中如何实现key唯一不重复 问题:如何做到Map中key唯一不重复,每次都遍历来equals比较吗? 首先,答案是否.如果全部遍历的话,当Map中元素很多的时候,显然查询效率低. 解释: HashMap属于散列存储结构,其table的存储是放在不同的Jvm内存区域.通过一个整型值来标识table的区域,相当于这个区域的下标.然后整个查找过程就从不再需要遍历整个table,只需遍历这一区域的数据即可. 结合HashMap.class中的put方法来说明: 如何找到这个区域呢? 1.首先将传入
-
详解Golang Map中的key为什么是无序的
目录 一.为什么是无序的? 二.GO 为什么要这么做? 三.遍历是否真的无序的 1.第一次遍历 2.第二次遍历 四.如何才能得到有序的键值对 总结 一.为什么是无序的? 开门见山,先上源码 func mapiterinit(t *maptype, h *hmap, it *hiter) { // decide where to start r := uintptr(fastrand()) if h.B > 31-bucketCntBits { r += uintptr(fastrand()) <
-
基于C++ map中key使用指针问题的详解
C++实际开发的过程会经常使用到map.map是一个key-value值对,key唯一,可以用find进行快速的查找.其时间复杂度为O(logN),如果采用for循环进行遍历数据时间复杂度为O(N).如果map中的数据量比较少时,采用find和for循环遍历的效率基本没有太大的区别,但是在实际的开发过程中,存储在map中的数据往往是大量的,这个时候map采用find方式效率比遍历效率高的多. 确定采用find方式查找数据后,我们需要考虑存储map的空间复杂度,对于基础数据类型的数据(int ch
-
java map中相同的key保存多个value值方式
目录 map中相同的key保存多个value值 如下代码 Map中相同的键Key不同的值Value实现原理 实现原理 总结 map中相同的key保存多个value值 在java中,Map集合中只能保存一个相同的key,如果再添加相同的key,则之后添加的key的值会覆盖之前key对应的值,Map中一个key只存在唯一的值. 如下代码 package test; import org.junit.Test; import java.util.HashMap; import java.util.Id
-
Java如何在Map中存放重复key
目录 如何在Map中存放重复key 1.概述 2.将集合作为Value 3.使用Apache Commons Collections 4.Guava Multimap 5.自定义MultiMap Map出现重复Key值叠加到上一个key中 如何在Map中存放重复key 1.概述 本文介绍几种处理Map中一个key对多个value的方法.在JDK标准Map实现中当我们尝试在一个key下插入多个value,那么后续的value会覆盖前面的value. Map<String, String> map
-
Java8 Map中新增的方法使用总结
前言 得益于 Java 8 的 default 方法特性,Java 8 对 Map 增加了不少实用的默认方法,像 getOrDefault, forEach, replace, replaceAll, putIfAbsent, remove(key, value), computeIfPresent, computeIfAbsent, compute 和merge 方法.另外与 Map 相关的 Map.Entry 也新加了多个版本的 comparingByKey 和 comparingByVal
-
Java基础将Bean属性值放入Map中的实例
Java基础将Bean属性值放入Map中的实例 利用发射将Java对象的属性值以属性名称为键,存储到Map中的简单实现.包括自身属性及从父类继承得到的属性.Java类型的getField[s]方法只能获取public 类型的属性,getDeclaredFields则能获取所有声明的属性,同时,如果类的可见性非公有,则Field的get(Object)方法将取不到具体的属性值. package com.wood.util; import java.lang.reflect.Field; impor
-
Java Map如何根据key取value以及不指定key取出所有的value
根据key取其value Map<String, String> map = new HashMap<String, String>(); map.put("b", "4"); map.put("a", "5"); map.put("c", "3"); map.put("d", "5"); // 根据key获取 其value
-
如何正确理解vue中的key详解
就目前所了解的情况,key的作用有以下这些. v-for遍历时,用id,uuid之类作为key,唯一标识节点加速虚拟DOM渲染 响应式系统没有监听到的数据,用+new Date()生成的时间戳作为key,手动强制触发重新渲染 场景一大同小异司空见惯,场景二是下面这样的: <div :key="rerender"> <span>Hello Vue.js !</span> <complexComponent :propObj="propO
随机推荐
- Js 小数验证函数代码(基于正则)
- 以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
- EasyUI实现二级页面的内容勾选的方法
- 详解Java编程中对线程的中断处理
- Javascript获取统一管理的提示语(message)
- 简单介绍Android开发中的Activity控件的基本概念
- PHP4在WinXP下IIS和Apache2服务器上的安装实例
- C语言实现最长递增子序列问题的解决方法
- 一款垃圾中的极品HTML编辑器(兼容IE OR FF)
- jQuery简单自定义图片轮播插件及用法示例
- 各浏览器对link标签onload/onreadystatechange事件支持的差异分析
- 学习Android开发之RecyclerView使用初探
- MySQL数据库之Purge死锁问题解析
- Android开发中ViewPager实现多页面切换效果
- 跟麻烦说拜拜 劲舞团快速更新方案
- Android 颜色大全color.xml文件使用方法
- spring boot整合Shiro实现单点登录的示例代码
- Centos7重启apache、nginx、mysql、php-fpm命令方法
- Scala可变参数列表,命名参数和参数缺省详解
- 浅谈Vue项目骨架屏注入实践