允许Key重复的Map - IdentityHashMap

在使用map的时候,大家肯定会想到key-value,key用于检索value的内容。在正常情况下,可以不允许重复;但是其实重复在java中分为2中情况,一是内存地址重复,另一个是不同的地址但内容相等,而IdentityHashMap用于后者,即内容相等。    更详细的解释如下:此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1 和 k2 相等(在正常 Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2)))。
此类不是 通用 Map 实现!此类实现 Map 接口时,它有意违反 Map 的常规协定,该协定在比较对象时强制使用 equals 方法。此类设计仅用于其中需要引用相等性语义的罕见情况。

 例如:
class Person{
    private String name ;
    private int age ;
    public Person(String name,int age){
        this.name = name ;
        this.age = age ;
    } public String toString(){
        return "姓名:" + this.name + ",年龄:" + this.age ;
    }
}; 

HashMap情况:
public class IdentityHashMapDemo01{
    public static void main(String args[]){
        Map<Person,String> map = new HashMap<Person,String>() ;
        map.put(new Person("张三",30),"zhangsan_1") ; // 加入内容
        map.put(new Person("张三",30),"zhangsan_2") ; // 加入内容
        map.put(new Person("李四",31),"lisi") ;   // 加入内容 
        Set<Map.Entry<Person,String>> allSet = map.entrySet() ;
        Iterator<Map.Entry<Person,String>> iter = allSet.iterator() ;
        while(iter.hasNext()){
            Map.Entry<Person,String> me = iter.next() ;
            System.out.println(me.getKey() + " --> " + me.getValue()) ;
        }
    }
}; 
结果:相同的key内容,value会被覆盖
姓名:李四,年龄:31 --> lisi
姓名:张三,年龄:30 --> zhangsan_2 

IdentityHashMap情况
public class IdentityHashMapDemo02{
    public static void main(String args[]){
        Map<Person,String> map = new IdentityHashMap<Person,String>() ;
        map.put(new Person("张三",30),"zhangsan_1") ; // 加入内容
        map.put(new Person("张三",30),"zhangsan_2") ; // 加入内容
        map.put(new Person("李四",31),"lisi") ;   // 加入内容 
        Set<Map.Entry<Person,String>> allSet = map.entrySet() ;
        Iterator<Map.Entry<Person,String>> iter = allSet.iterator() ;
        while(iter.hasNext()){
            Map.Entry<Person,String> me = iter.next() ;
            System.out.println(me.getKey() + " --> " + me.getValue()) ;
        }
    }
}; 
结果:相同的key内容(由于是new出来的,内存地址不同但内容相同),但value不会被覆盖
姓名:张三,年龄:30 --> zhangsan_2
姓名:张三,年龄:30 --> zhangsan_1
姓名:李四,年龄:31 --> lisi 
时间: 2024-10-15 17:54:02

允许Key重复的Map - IdentityHashMap的相关文章

java中key值可以重复的map:IdentityHashMap

在Java中,有一种key值可以重复的map,就是IdentityHashMap.在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 .在正常的Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2)). IdentityHashMap类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性.该类不是 通用 Map 实现!此类

【语言】java中key值可以重复的map:IdentityHashMap

http://www.rigongyizu.com/java-identityhashmap/ 在java中, 有一种key值可以重复的map,就是IdentityHashMap.在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 .在正常的Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2)). IdentityHashMap类利用哈希表实

JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)

测试又报bug啦 接到测试小伙伴的问题,说是一个接口不返回数据了,好吧,虽然不是我写的接口任务落到头上也得解决,本地调试了一下,好家伙,直接抛了个异常出来,这又是哪位大哥喝醉了写的代码... Exception in thread "main" java.lang.IllegalStateException: Duplicate key at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)

【转】由2个值组合成key的STL map排序问题

转自:http://blog.csdn.net/pathuang68/article/details/7526305 某网友问:"map中怎么设置多个key值进行排序?" 在C++中,map是典型的关联容器或者叫映射容器(associative container),其中的每一个元素都是由key-value这样成对出现的内容组成的,比如学号和学生之类具有一一对应关系的情形,学号可以作为key,学生对象可以作为key所对应的value.很显然这种情况下的key只有一个值,但是,在实际工作

java 多种判断key是否在map中存在的方法

java 中有时候会遇到判断传过来的map里是否包含了指定的key,我目前只发现两种办法,如果有其他方法欢迎补充 我添加上去: HashMap map = new HashMap(); map.put("1", "value1"); map.put("2", "value2"); Iterator keys = map.keySet().iterator(); while(keys.hasNext()){ String key

1034 Head of a Gang (边不重复 dfs+map)

One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time length of all the phone calls made b

封装一个按Key排序的Map工具

Map是集合的存放顺序是按哈希值定的,有时候不是我们需要的,当想要一个按自己规定顺序存放顺序,可以用LinkedHashMap,这里自己把LinkedHashMap封装了一次 package test.com.reflect; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; im

java中的不同的key类型从map中获取不同的value值

protected <V> V getValFromMap(Map<String, Object> headers, String name, Class<V> type) { Object value = headers.get(name); if (value == null) { return null; } if (!type.isAssignableFrom(value.getClass())) { if (logger.isWarnEnabled()) {

ORA-14400: inserted partition key does not map to any partition

数据库表已经分区,如果插入数据时出现错误提示: ORA-14400: 插入的分区关键字超出最高合法分区关键字. 原因是因为分区已经过期 解决方法: 手工添加了一个分区,终止日期大于当前日期即可. 建表的SQL: create table DATE (   ID            VARCHAR2(20) not null,   NEWYEAR   VARCHAR2(20) not null,   NEWMONTH  VARCHAR2(20) not null, ) partition by