精华内容
下载资源
问答
  • 在使用map的时候,大家肯定会想到key-value,key用于检索value内容。在正常情况下,可以不允许重复;但是其实重复在java中分为2中情况,一是内存地址重复,另一个是不同地址但内容相等,而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 方法。此类设计仅用于其中需要引用相等性语义的罕见情况。

    例如:

    classPerson{

    privateString name ;

    privateintage ;

    publicPerson(String name,intage){

    this.name = name ;

    this.age = age ;

    }

    publicbooleanequals(Object obj){

    if(this==obj){

    returntrue;

    }

    if(!(objinstanceofPerson)){

    returnfalse;

    }

    Person p = (Person)obj ;

    if(this.name.equals(p.name)&&this.age==p.age){

    returntrue;

    }else{

    returnfalse;

    }

    }

    publicinthashCode(){

    returnthis.name.hashCode() *this.age ;

    }

    publicString toString(){

    return"姓名:"+this.name +",年龄:"+this.age ;

    }

    };

    HashMap情况:

    publicclassIdentityHashMapDemo01{

    publicstaticvoidmain(String args[]){

    Map map = null;// 声明Map对象

    map = newHashMap() ;

    map.put(newPerson("张三",30),"zhangsan_1") ;// 加入内容

    map.put(newPerson("张三",30),"zhangsan_2") ;// 加入内容

    map.put(newPerson("李四",31),"lisi") ;// 加入内容

    Set> allSet = null;// 准备使用Set接收全部内容

    allSet = map.entrySet() ;

    Iterator> iter = null;

    iter = allSet.iterator() ;

    while(iter.hasNext()){

    Map.Entry me = iter.next() ;

    System.out.println(me.getKey() + " --> "+ me.getValue()) ;

    }

    }

    };

    结果:相同的key内容,value会被覆盖

    姓名:李四,年龄:31 -->lisi

    姓名:张三,年龄:30 -->zhangsan_2

    IdentityHashMap情况

    publicclassIdentityHashMapDemo02{

    publicstaticvoidmain(String args[]){

    Map map = null;// 声明Map对象

    map = newIdentityHashMap() ;

    map.put(newPerson("张三",30),"zhangsan_1") ;// 加入内容

    map.put(newPerson("张三",30),"zhangsan_2") ;// 加入内容

    map.put(newPerson("李四",31),"lisi") ;// 加入内容

    Set> allSet = null;// 准备使用Set接收全部内容

    allSet = map.entrySet() ;

    Iterator> iter = null;

    iter = allSet.iterator() ;

    while(iter.hasNext()){

    Map.Entry me = iter.next() ;

    System.out.println(me.getKey() + " --> "+ me.getValue()) ;

    }

    }

    };

    结果:相同的key内容(由于是new出来的,内存地址不同但内容相同),但value不会被覆盖

    姓名:张三,年龄:30 -->zhangsan_2

    姓名:张三,年龄:30 -->zhangsan_1

    姓名:李四,年龄:31 -->lisi

    展开全文
  • 我们平时使用的Map,都是只能在Map中保存一个相同的Key,我们后面保存的相同的key都会将原来的key的值覆盖掉,如下面的例子。public class test {publicstatic void main(String[] args) {String str1 = new String...

    我们平时使用的Map,都是只能在Map中保存一个相同的Key,我们后面保存的相同的key都会将原来的key的值覆盖掉,如下面的例子。

    public class test {

    public

    static void main(String[] args) {

    String str1 = new String("abc");

    String str2 = new String("abc");

    System.out.println(str1 == str2); //false

    Map map = new HashMap();

    map.put(str1, "hello");

    map.put(str2, "world");

    for(Entry entry :map.entrySet())

    {

    System.out.println(entry.getKey()+" " + entry.getValue());

    }

    System.out.println("---->" + map.get("abc"));

    }

    }

    这个例子中我们可以看见相同的key只能保存一个value值,下面我们来看一种map可以实现一个key中保存多个value。这个map也就是IdentityHashMap。下面我们就来介绍下IdentityHashMap这个类的使用。

    API上这样来解释这个类的:此类不是通用Map实现!此类实现Map接口时,它有意违反Map的常规协定,该协定在比较对象时强制使用

    equals 方法。此类设计仅用于其中需要引用相等性语义的罕见情况。

    IdentityHashMap类利用哈希表实现Map接口,比较键(和值)时使用引用相等性代替对象相等性。我们来看看这个类的代码吧:

    public class test1 {

    public

    static void main(String[] args) {

    String str1 = "abc";

    String str2 = "abc";

    System.out.println(str1 == str2); //true

    Map map = new IdentityHashMap();

    map.put(str1, "hello");

    map.put(str2, "world");

    for(Entry entry : map.entrySet())

    {

    System.out.println(entry.getKey()+" " + entry.getValue());

    }

    System.out.println("containsKey---> " +

    map.containsKey("abc"));

    System.out.println("value----> " + map.get("abc"));

    }

    }

    这端代码输出的结果如下:

    true

    abc world

    containsKey---> true

    value----> world

    为什么我们的Key还是只保存了一个值????这个问题和《java解惑第62题一样》书上面是这样解释的,我们来看看:

    语言规范保证了字符串是内存限定的,换句话说,相等的字符串常量同时也是相同的对象。这可以确保在我们的程序中第二次出现的字符串字面常量“abc”引用到了与第一次相同的String实例上,因此尽管我们使用了一个IdentityHashMap来代替诸如HashMap这样的通用目的的Map实现,但是对程序的行为却不会产生任何影响。

    我们来看看下面的代码就可以实现一个key保存两个value的情况。我们的代码如下:

    public class test1 {

    public

    static void main(String[] args) {

    String str1 = new String("abc");

    String str2 = new String("abc");

    System.out.println(str1 == str2); //false

    Map map = new IdentityHashMap();

    map.put(str1, "hello");

    map.put(str2, "world");

    for(Entry entry : map.entrySet())

    {

    System.out.println(entry.getKey()+" " + entry.getValue());

    }

    System.out.println(" containsKey---> " + map.containsKey("abc"));

    System.out.println("str1 containsKey---> " +

    map.containsKey(str1));

    System.out.println("str2 containsKey---> " +

    map.containsKey(str2));

    System.out.println(" value----> " + map.get("abc"));

    System.out.println("str1 value----> " +

    map.get(str1));

    System.out.println("str2 value----> " +

    map.get(str2));

    }

    }

    我们的看看输出的结果为:

    false

    abc world

    abc hello

    containsKey---> false

    str1 containsKey---> true

    str2 containsKey---> true

    value----> null

    str1 value----> hello

    str2 value----> world

    我们可以知道IdentityHashMap是靠对象来判断key是否相等的,如果我们一个key需要保存多个value的时候就需要使用到这个IdentityHashMap类,这样我们我们就可以需要的时候使用到这个类了。

    展开全文
  • 在使用map的时候,大家肯定会想到key-value,key用于检索value内容。在正常情况下,可以不允许重复;但是其实重复在java中分为2中情况,一是内存地址重复,另一个是不同地址但内容相等,而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 boolean equals(Object obj){ 

            if(this==obj){ 

                return true ; 

            } 

            if(!(obj instanceof Person)){ 

                return false ; 

            } 

            Person p = (Person)obj ; 

            if(this.name.equals(p.name)&&this.age==p.age){ 

                return true ; 

            }else

                return false ; 

            } 

        } 

        public int hashCode(){ 

            return this.name.hashCode() * this.age ; 

        } 

        public String toString(){ 

            return "姓名:" + this.name + ",年龄:" + this.age ; 

        } 

    }; 

    HashMap情况:

    public class IdentityHashMapDemo01{ 

        public static void main(String args[]){ 

            Map<Person,String> map = null ; // 声明Map对象 

            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 = null ;   // 准备使用Set接收全部内容 

            allSet = map.entrySet() ; 

            Iterator<Map.Entry<Person,String>> iter = null ; 

            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 = null ; // 声明Map对象 

            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 = null ;   // 准备使用Set接收全部内容 

            allSet = map.entrySet() ; 

            Iterator<Map.Entry<Person,String>> iter = null ; 

            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


    转载于:https://my.oschina.net/u/1865558/blog/384493

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

    在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

    展开全文
  • 查阅资料,发现是不可以的,因为map是无序的,它的查询需要通过key的值来查找,如果你定义两个同样的key,那么一个key就对应了多个值,这样就违背了java对map的定义,键和值是一一对应的。所以key不可以重复。写个...
  • HashMap的key值不允许重复问题package com.wang.testMianShi;public class Person {private String name;private int age;public Person() {super();}public Person(String name, int age) {super();this.name = ...
  • 在实际的项目中可能会碰到key重复的情况,正常的MAP类型是不允许重复key,所以就要使用multimap了,multimap的使用和map基本类似,可以无缝对接 #include &lt;map&gt;   typedef pair&lt;string, int...
  • 查阅资料,发现是不可以的,因为map是无序的,它的查询需要通过key的值来查找,如果你定义两个同样的key,那么一个key就对应了多个值,这样就违背了java对map的定义,键和值是一一对应的。所以key不可以重复。写个...
  • 那么问题来了,有时候后台需要我们发送json字符串数组,这时候就需要map集合的key值时相同的,网上找了很多方法,都是说重写key的hashCode()和map的put()方法,就可以实现对于相同key下多个value的存储.而我推荐的方法是...
  • 所有Map操作中key的值是不能重复的,例如,HashMap操作...范例:Map中的key不允许重复,重复就是覆盖 package org.lxh.demo13.mapdemo; import java.util.HashMap; import java.util.Iterator; import java...
  • Java中的Map允许重复元素吗?

    万次阅读 2018-06-22 14:37:05
    查阅资料,发现是不可以的,因为map是无序的,它的查询需要通过key的值来查找,如果你定义两个同样的key,那么一个key就对应了多个值,这样就违背了java对map的定义,键和值是一一对应的。所以key不可以重复。写个...
  • 范例:Map的key允许重复,重复就是覆盖   [java] view plaincopy package org.lxh.demo13.mapdemo;  import java.util.HashMap;  import java.util.Iterator;  import...
  • 用jdk本身的map是实现不了这种情况: 有重复key 但是不需要新的映射值value覆盖先前的value。public interface Map将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射一个值。自然继承一下HashMap,...
  • 在使用map的时候,大家肯定会想到key-value,key用于检索value内容。在正常情况下,可以不允许重复;但是其实重复在java中分为2中情况,一是内存地址重复,另一个是不同地址但内容相等,而IdentityHashMap用于后...
  • stl中map的key可以重复吗?

    千次阅读 2020-07-03 18:05:56
    对于STL中的map中的key可以重复吗?答案就是key不可以重复,但是value是可以重复的。 如果需要key值相同那么可以采用multimap,是允许key重复的。 例如: m.insert(make_pair<int, int>(1, 3)); m.insert...
  • 1. Map key允许重复,重复就是覆盖    之前讲解所有 Map 操作中 key 值是不能重复,例如,HashMap 操作时候是不能重复,如果重复肯定会覆盖之前内容。 实例 1 代码: package self.learn....
  • JavaHashMap中key是不可以重复的,如果重复添加话,HashMap会自动覆盖key一样数据,保证一个key对应一个value,使用时只要把一个HashMap里数据按照key依次加到另一个HashMap里即可。代码实例Map param = new...
  • 可以存储相同key的map——Multimap

    千次阅读 2014-10-23 17:32:34
     Multimap允许key重复Map是不允许的,若在装入Map时,出现相同key,后者会将前者覆盖)。  2. 判断两个集合是否存在交集:!Collections.disjoint(list1, list2);  或!CollectionUtils.containsAny(list1,...
  • 在介绍 HashMap 首先介绍下 Map 接口此接口位于 java.util 包下,该接口共有四个常用实现类,分别是 HashMap、LinkedHashMap、TreeMap、Hashtable。继承关系如图:HashMap 它... HashMap最多只允许一条记录键为nul...
  • java map的key排序吗java为数据结构中的映射定义了一个接口java.util.Map,他实现了四个类,分别是:HashMap,HashTable,LinkedHashMapTreeMap,Map不允许重复,但允许重复1.HashMap:最常用的Map,根据键的...
  • Map就是用来存储“键(key)-值(value) 对”Map类中存储“键值对”通过键来标识,所以“键对象”不能重复Map 接口实现类有HashMap、TreeMap、HashTable、Properties等。Map接口中常用方法:HashMap采用...
  • Java入职面试宝典--HashMap的秘密导语 HashMap是Java开发中...1概述HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。遍历时,取得数据的顺序是完全随...
  • HashMap概述基于哈希表 Map 接口实现。此实现提供所有可选映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射顺序,特别是它...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,945
精华内容 778
关键字:

允许重复key的map