在Java中,有一种key值可以重复的map,就是IdentityHashMap。在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 。在正常的Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2))。

IdentityHashMap类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。该类不是 通用 Map 实现!此类实现 Map 接口时,它有意违反 Map 的常规协定,该协定在比较对象时强制使用 equals 方法。此类设计仅用于其中需要引用相等性语义的罕见情况。

在使用IdentityHashMap有些需要注意的地方:

例子1:

IdentityHashMap map =new IdentityHashMap();

map.put(newString("xx"),"first");

map.put(newString("xx"),"second");

for (Entry entry : map.entrySet()) {

System.out.print(entry.getKey() +" ");

System.out.println(entry.getValue());

}

System.out.println("idenMap="+map.containsKey("xx"));

System.out.println("idenMap="+map.get("xx"));

输出结果是:

xx first

xx second

idenMap=false

idenMap=null

例子2:

IdentityHashMap map =new IdentityHashMap();

String fsString =newString("xx");

map.put(fsString,"first");

map.put(newString("xx"),"second");

for(Entry entry : map.entrySet()) {

System.out.print(entry.getKey() +" ");

System.out.println(entry.getValue());

}

System.out.println("idenMap="+map.containsKey(fsString));

System.out.println("idenMap="+map.get(fsString));

输出结果是:

xx second

xx first

idenMap=true

idenMap=first

例子3:

IdentityHashMap map =new IdentityHashMap();

String fsString =newString("xx");

map.put(fsString,"first");

map.put(fsString,"second");

for(Entry entry : map.entrySet()) {

System.out.print(entry.getKey() +" ");

System.out.println(entry.getValue());

}

System.out.println("idenMap="+map.containsKey(fsString));

System.out.println("idenMap="+map.get(fsString));

输出结果是:

xx second

idenMap=true

idenMap=second

例子4:

IdentityHashMap map =new IdentityHashMap();

String fsString =newString("xx");

String secString =newString("xx");

map.put(fsString,"first");

map.put(secString,"second");

for(Entry entry : map.entrySet()) {

System.out.print(entry.getKey() +" ");

System.out.println(entry.getValue());

}

System.out.println("idenMap="+map.containsKey(fsString));

System.out.println("idenMap="+map.get(fsString));

System.out.println("idenMap="+map.containsKey(secString));

System.out.println("idenMap="+map.get(secString));

输出结果是:

xx first

xx second

idenMap=true

idenMap=first

idenMap=true

idenMap=second

例子5:

IdentityHashMap map =new IdentityHashMap();

map.put("xx","first");

map.put("xx","second");

for(Entry entry : map.entrySet()) {

System.out.print(entry.getKey() +" ");

System.out.println(entry.getValue());

}

输出结果是:

xx second

可以看到,在IdentityHashMap中,是判断key是否为同一个对象,而不是普通HashMap的equals方式判断。

参考:http://blog.csdn.net/stoneok07/article/details/7262676

java map 允许重复_java中key值可以重复的map:IdentityHashMap相关推荐

  1. java不可变类型_Java中的值类型:为什么它们不可变?

    java不可变类型 值类型不必是不变的. 但是他们是. 在上一篇文章中,我讨论了Java中指针与引用之间的区别以及如何传递方法参数(按值传递或按引用传递). 这些与Java中尚不存在的值类型密切相关( ...

  2. java list map 去重复_Java中List集合去除重复数据的六种方法

    1. 循环list中的所有元素然后删除重复 public static List removeDuplicate(List list) { for ( int i = 0 ; i < list. ...

  3. java 有序不重复_Java中自定义有序不重复的集合——SetList

    由于课程设计的需要,笔者需要将数据库中的某个表的数据拿出来处理 例如楼层和建筑表,有外键限制 一开始是使用List保存的,但实际操作中发现,从表中取出来楼层数据中的建筑有些是重复的 List接口实现的 ...

  4. java的幂运算_java中幂指数值的运算

    说到幂指数的运算我们就会用到Math.pow(double a,double b),返回的结果是a的b次方. 这个方法可以满足我们大多数幂指数的计算,但是每次访问的值和传入的值都是double,自己不 ...

  5. C++判断map中key值是否存在

    C++ map中key值存在情况判定 1.count函数 count函数用于统计key值在map中出现的次数,map的key不允许重复,因此如果key存在返回1,不存在返回0 if (testMap. ...

  6. java 中map的优点_java 中map遍历的四种方法和优缺点

    /** * 在for-each循环中使用entries来遍历 * 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用 * 如果遍历的是一个空的map,会报数组越界 ,java5引入 ...

  7. java 可重复map_map的键值可以重复吗

    java map的key可以重复吗 如果重复添加的话,hashmap会自动覆盖key一样的数据,保证一个key对应一个value 也就是说,你只要把一个map2里的数据按照key一个一个都加到map1 ...

  8. el表达式遍历list中的list_EL表达式获取map和list集合中的值 | 学步园

    Map的每个对象以key=value的形式给出 当forEach tag的item属性中的表达式的值是java.util.Map时,在var中命名的变量被设置为类型是java.util.Map.Ent ...

  9. python 下划线转驼峰_json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: 原json串: String json= "{'user_name':'ok','user_sex':0,'object_info ...

最新文章

  1. C#做的在线升级小程序
  2. compareto方法_compare方法和compareTo方法区别
  3. boost::signals2模块实现定制组合器的测试程序
  4. linux QT 结束当前进程_Qt编写控件属性设计器7-串口采集
  5. 番茄花园win11 32位官方原版镜像文件v2021.07
  6. Python | 这是过七夕吗?这是趁机学习一下下,就一下~~
  7. 【AI视野·今日CV 计算机视觉论文速览 第152期】Fri, 9 Aug 2019
  8. swap函数_[C++基础入门] 6、函数
  9. 蓝桥杯BASIC-28 基础练习 Huffuman树
  10. 自媒体时事热点类素材哪里找?推荐这3个网站
  11. CV520国产兼容应用及说明
  12. c语言vs2013下载官方下载,Microsoft Visual C++2013运行库下载
  13. [图形学]ASTC纹理压缩格式
  14. 银河帝国----基地前奏
  15. 沥青路面粘弹性力学分析基础研究
  16. 2008年度中国最佳MBA排行榜
  17. idea 一直 performing vcs refresh
  18. TORCH.JIT理解
  19. 关于视觉SLAM的最先进技术的调查-A survey of state-of-the-art on visual SLAM
  20. 网页模板设计中5种常见的设计版式类型介绍

热门文章

  1. 做虚拟化服务器的配资一致嘛,服务器虚拟化技术在校园网管理中的应用探讨.pdf...
  2. click js自动点击 vue_vue.js2.0点击获取自己的属性和jquery方法
  3. 王道操作系统考研笔记——2.3.2 进程互斥的软件实现方法
  4. Flask设置返回json格式数据
  5. Linux tcpdump命令用法详解
  6. Linux下获得线程ID syscall(224)
  7. [react-router] 请你说说react的路由是什么?
  8. React开发(148):componentWillReceiveProps
  9. Taro+react开发(20)--控制icon大小
  10. [html] 怎么去除img之间存在的间隔缝隙?