精华内容
下载资源
问答
  • 允许Key重复Map - IdentityHashMap

    千次阅读 2017-11-21 21:57:00
    在使用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 方法。此类设计仅用于其中需要引用相等性语义的罕见情况。

     

     例如:

     
     
    1. class Person{ 
    2.     private String name ; 
    3.     private int age ; 
    4.     public Person(String name,int age){ 
    5.         this.name = name ; 
    6.         this.age = age ; 
    7.     } 
    8.     public boolean equals(Object obj){ 
    9.         if(this==obj){ 
    10.             return true ; 
    11.         } 
    12.         if(!(obj instanceof Person)){ 
    13.             return false ; 
    14.         } 
    15.         Person p = (Person)obj ; 
    16.         if(this.name.equals(p.name)&&this.age==p.age){ 
    17.             return true ; 
    18.         }else
    19.             return false ; 
    20.         } 
    21.     } 
    22.     public int hashCode(){ 
    23.         return this.name.hashCode() * this.age ; 
    24.     } 
    25.     public String toString(){ 
    26.         return "姓名:" + this.name + ",年龄:" + this.age ; 
    27.     } 
    28. }; 

    HashMap情况:

     
     
    1. public class IdentityHashMapDemo01{ 
    2.     public static void main(String args[]){ 
    3.         Map<Person,String> map = null ; // 声明Map对象 
    4.         map = new HashMap<Person,String>() ; 
    5.         map.put(new Person("张三",30),"zhangsan_1") ; // 加入内容 
    6.         map.put(new Person("张三",30),"zhangsan_2") ; // 加入内容 
    7.         map.put(new Person("李四",31),"lisi") ;   // 加入内容 
    8.         Set<Map.Entry<Person,String>> allSet = null ;   // 准备使用Set接收全部内容 
    9.         allSet = map.entrySet() ; 
    10.         Iterator<Map.Entry<Person,String>> iter = null ; 
    11.         iter = allSet.iterator() ; 
    12.         while(iter.hasNext()){ 
    13.             Map.Entry<Person,String> me = iter.next() ; 
    14.             System.out.println(me.getKey() + " --> " + me.getValue()) ; 
    15.         } 
    16.     } 
    17. }; 

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

     
     
    1. 姓名:李四,年龄:31 --> lisi 
    2. 姓名:张三,年龄:30 --> zhangsan_2 

    IdentityHashMap情况

     
     
    1. public class IdentityHashMapDemo02{ 
    2.     public static void main(String args[]){ 
    3.         Map<Person,String> map = null ; // 声明Map对象 
    4.         map = new IdentityHashMap<Person,String>() ; 
    5.         map.put(new Person("张三",30),"zhangsan_1") ; // 加入内容 
    6.         map.put(new Person("张三",30),"zhangsan_2") ; // 加入内容 
    7.         map.put(new Person("李四",31),"lisi") ;   // 加入内容 
    8.         Set<Map.Entry<Person,String>> allSet = null ;   // 准备使用Set接收全部内容 
    9.         allSet = map.entrySet() ; 
    10.         Iterator<Map.Entry<Person,String>> iter = null ; 
    11.         iter = allSet.iterator() ; 
    12.         while(iter.hasNext()){ 
    13.             Map.Entry<Person,String> me = iter.next() ; 
    14.             System.out.println(me.getKey() + " --> " + me.getValue()) ; 
    15.         } 
    16.     } 
    17. }; 

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

     
     
    1. 姓名:张三,年龄:30 --> zhangsan_2 
    2. 姓名:张三,年龄:30 --> zhangsan_1 
    3. 姓名:李四,年龄:31 --> lisi 

     

     本文转自 zhouhaipeng 51CTO博客,原文链接:http://blog.51cto.com/tianya23/707603,如需转载请自行联系原作者


    展开全文
  • 今天小编就为大家分享一篇关于Java中的Map允许重复元素吗?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • map key不可重复

    千次阅读 2017-04-01 09:51:28
    步骤:从数据库读取数据,在ztree下拉树初始化勾选节点时勾选的节点一直...开始以为是ztree初始化出的问题,原来在存放map键值对的时候存放了重复key,导致存放的key不完整。key和value互换位置解决问题。 代码如下:

    步骤:从数据库读取数据,在ztree下拉树初始化勾选节点时勾选的节点一直不完整。开始以为是ztree初始化出的问题,原来在存放map键值对的时候存放了重复的key,导致存放的key不完整。key和value互换位置解决问题。

    代码如下:

    /**
    	 * 根据角色初始勾选菜单
    	 * @param request
    	 * @param response
    	 */
    	@RequestMapping("v_initMenu.aspx")
    	public void initCheckedMenu(HttpServletRequest request , HttpServletResponse response){
    		String jsonStr = "{\"result\":1}";
    		String id=request.getParameter("roleId");
    		List<TbAllianceRoleMenu> list = roleMenuService.findByRoleId(id);
    		Map<String, String> map = new HashMap<String, String>();
    		if(list != null){
    			for (TbAllianceRoleMenu tbAllianceRoleMenu : list) {
    				TbAllianceMenu menu = tbAllianceRoleMenu.getMenu();
    				//String type = menu.getMenuType();
    				//if(type != null && type.equals("btn")){
    					map.put(menu.getId(), menu.getName());
    				//}
    			}
    		}
    		try {
    			JSONArray json1 = JSONArray.fromObject(map);
    			jsonStr = json1.toString();
    			ResponseUtils.renderJson(response, jsonStr);
    		} catch (Exception e) {
    			log.error("initMenu", e);
                ResponseUtils.renderJson(response, jsonStr);
    		}
    	}


    展开全文
  • 范例:Map中的key允许重复重复就是覆盖   [java] view plaincopy package org.lxh.demo13.mapdemo;  import java.util.HashMap;  import java.util.Iterator;  import...

    范例:Map中的key不允许重复,重复就是覆盖

     

    [java]  view plain copy
    1. package org.lxh.demo13.mapdemo;    
    2. import java.util.HashMap;    
    3. import java.util.Iterator;    
    4. import java.util.Map;    
    5. import java.util.Set;    
    6. class Person {                                
    7. // 定义Person类    
    8.     private String name;                     
    9. // 定义name属性    
    10.     private int age;                          
    11. // 定义age属性    
    12.     public Person(String name, int age) {     
    13. // 通过构造方法为属性赋值    
    14.         this.name = name;                     
    15. // 为name属性赋值    
    16.         this.age = age;                       
    17. // 为age属性赋值    
    18.     }    
    19.     public boolean equals(Object obj) {      
    20. // 覆写equals()方法    
    21.         if (this == obj) {                    
    22. // 判断地址是否相等    
    23.             return true;                      
    24. // 返回true表示同一对象    
    25.         }    
    26.         if (!(obj instanceof Person)) {       
    27. // 传递进来的不是本类的对象    
    28.             return false;                     
    29. // 返回false表示不是同一对象    
    30.         }    
    31.         Person p = (Person) obj;              
    32. // 进行向下转型    
    33.         if (this.name.equals(p.name) &&  
    34. this.age == p.age) {    
    35.             return true ;                     
    36. // 属性依次比较,相等返回true    
    37.         }else{    
    38.             return false ;                    
    39. // 属性内容不相等,返回false    
    40.         }    
    41.     }    
    42.     public int hashCode(){                      
    43. // 覆写hashCode()方法    
    44.         return this.name.hashCode() * this.age ;    
    45. // 计算公式    
    46.     }    
    47.     public String toString() {                      
    48. // 覆写toString()方法    
    49.         return "姓名:" + this.name + ";年龄:"   
    50. this.age;   // 返回信息    
    51.     }    
    52. }     
    53. public class IdentityHashMapDemo01 {    
    54.     public static void main(String[] args) {    
    55.         Map<Person, String> map = null;              
    56. // 声明Map对象,指定    
    57. 泛型类型    
    58.         map = new HashMap<Person, String>();           
    59. // 实例化Map对象    
    60.         map.put(new Person("张三"30), "zhangsan_1");    
    61. // 增加内容    
    62.         map.put(new Person("张三"30), "zhangsan_2");     
    63. // 增加内容,key重复    
    64.         map.put(new Person("李四"31), "lisi");       
    65. // 增加内容    
    66.         Set<Map.Entry<Person, String>> allSet = null;    
    67. // 声明一个Set集合    
    68.         allSet = map.entrySet();                    
    69. // 将Map接口实例变为    
    70. Set接口实例    
    71.         Iterator<Map.Entry<Person, String>>   
    72. iter = null;    // 声明Iterator    
    73. 对象    
    74.         iter = allSet.iterator();                
    75. // 实例化Iterator    
    76. 对象    
    77.         while (iter.hasNext()) {                 
    78. // 迭代输出    
    79.             Map.Entry<Person, String> me =   
    80. iter.next();// 每个对象都是Map.     
    81. Entry实例    
    82.             System.out.println(me.getKey()     
    83.                     + " --> " + me.getValue());    
    84. // 输出key和value    
    85.         }    
    86.     }    
    87. }   
     

    程序运行结果:

    [java]  view plain copy
    1. 姓名:李四;年龄:31 --> lisi    
    2. 姓名:张三;年龄:30 --> zhangsan_2   
     

    从程序的运行结果中可以发现,第二个内容覆盖了第一个内容,所以此时可以使用Identity HashMap。使用此类时只要地址不相等(key1!=key2),就表示不是重复的key,可以添加到集合中。

    范例:使用IdentityHashMap修改程序

    [java]  view plain copy
    1. package org.lxh.demo13.mapdemo;    
    2. import java.util.IdentityHashMap;    
    3. import java.util.Iterator;    
    4. import java.util.Map;    
    5. import java.util.Set;    
    6. class Person {    
    7.     // 此类与之前定义一样,此处不再列出    
    8. }    
    9. public class IdentityHashMapDemo02 {    
    10.     public static void main(String[] args) {    
    11.         Map<Person, String> map = null;          
    12. // 声明Map对象,指定    
    13. 泛型类型    
    14.         map = new IdentityHashMap<Person, String>();   
    15. // 实例化Map对象    
    16.         map.put(new Person("张三"30), "zhangsan_1");   
    17. // 增加内容    
    18.         map.put(new Person("张三"30), "zhangsan_2");    
    19. // 增加内容,key重复    
    20.         map.put(new Person("李四"31), "lisi");      
    21. // 增加内容    
    22.         Set<Map.Entry<Person, String>> allSet =   
    23. null;   // 声明一个Set集合    
    24.         allSet = map.entrySet();                 
    25. // 将Map接口实例变为    
    26. Set接口实例    
    27.         Iterator<Map.Entry<Person, String>>   
    28. iter = null;// 声明Iterator对象    
    29.         iter = allSet.iterator();              
    30. // 实例化Iterator    
    31. 对象    
    32.         while (iter.hasNext()) {                 
    33. // 迭代输出    
    34.             Map.Entry<Person, String> me =   
    35. iter.next();// 每个对象都是Map.    
    36. Entry实例    
    37.             System.out.println(me.getKey()     
    38.                     + " --> " + me.getValue());    
    39. // 输出key和value    
    40.         }    
    41.     }    
    42. }   
     

    程序运行结果:

    [java]  view plain copy
    1. 姓名:张三;年龄:30 --> zhangsan_2    
    2. 姓名:张三;年龄:30 --> zhangsan_1    
    3. 姓名:李四;年龄:31 --> lisi   
     

    从程序的运行结果中可以发现,现在的key允许重复,只要两个对象的地址不相等即可。

    展开全文
  • Java 8 List转Map(解决key重复报异常)

    万次阅读 2018-11-02 16:37:03
    package com.demo.jdk8.collectors; import com.demo.jdk8.collectors.model.User; import com.google.common.collect.Lists; ...import org.junit.jupiter.api.Test;...import java.util.Map; ...
    package com.demo.jdk8.collectors;
    
    import com.demo.jdk8.collectors.model.User;
    import com.google.common.collect.Lists;
    import org.junit.jupiter.api.Test;
    
    import java.util.List;
    import java.util.Map;
    import java.util.function.Function;
    import java.util.stream.Collectors;
    
    /**
     * throw new IllegalStateException(String.format("Duplicate key %s", u));
     * 解决方法:调用三个参数的toMap重载方法,第三个参数为:BinaryOperator<U> mergeFunction
     *
     * @author Shanks
     * @date 2018-10-10
     */
    public class ToMapTest {
    
        private static User user = new User(1, "Tom");
        private static User user1 = new User(2, "Jerry");
        private static User user2 = new User(3, "Rose");
        private static User user3 = new User(3, "Jack");
        private static List<User> list = Lists.newArrayList(user, user1, user2);
        private static List<User> listDuplicateKey = Lists.newArrayList(user, user1, user2, user3);
    
        @Test
        void testUniqueKey() {
            Map<Integer, String> map = list.stream()
                    .collect(Collectors.toMap(User::getId, User::getName));
            map.forEach((k, v) -> System.out.println(k + "-->" + v));
        }
    
        /**
         * toMap默认方法有个参数:throwingMerger(),当key重复值,抛异常:
         * throw new IllegalStateException(String.format("Duplicate key %s", u));
         */
        @Test
        void testDuplicateKeyThrowException() {
            Map<Integer, String> map = listDuplicateKey.stream().collect(Collectors.toMap(User::getId, User::getName));
            map.forEach((k, v) -> System.out.println(k + ": " + v));
        }
    
        @Test
        void testDuplicateKey() {
            Map<Integer, String> map = listDuplicateKey.stream()
                    .collect(Collectors.toMap(User::getId, User::getName, (oldValue, newValue) -> newValue));
            map.forEach((k, v) -> System.out.println(k + "-->" + v));
        }
    
        /**
         * Function.identity()获取List里面的泛型属性实体,此方式也是不允许出现重复key
         */
        @Test
        void testIdentityUniqueKey() {
            Map<Integer, User> map = list.stream().collect(Collectors.toMap(User::getId, Function.identity()));
            map.forEach((k, v) -> System.out.println(k + "-->" + v));
        }
    
        @Test
        void testIdentityDuplicateKey() {
            Map<Integer, User> map = listDuplicateKey.stream()
                    .collect(Collectors.toMap(User::getId, Function.identity(), (oldValue, newValue) -> newValue));
            map.forEach((k, v) -> System.out.println(k + "-->" + v));
        }
    }
    

    再来一个小案例:

    @Test
    public void testToMap() {    
        Person p1 = new Person("kevin", 25);
        Person p2 = new Person("andy", 30);
        Person p3 = new Person("tony", 25);
        Person p4 = new Person("kevin", 20);
        Person p5 = new Person("kevin", 20);
        List<Person> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        System.out.println("----->Collectors.toMap,添加处理重复key的参数..");
        Map<String, Person> map = list.stream().collect(Collectors.toMap(person -> person.getName() + "_" + LocalDate.now(), person -> person, (oldValue, newValue) -> newValue));
        System.out.println(JSON.toJSONString(map));
    }
    

    打印结果:

    ----->Collectors.toMap,添加处理重复key的参数..
    {"kevin_2019-01-15":{"age":20,"name":"kevin"},"tony_2019-01-15":{"age":25,"name":"tony"},"andy_2019-01-15":{"age":30,"name":"andy"}}
    

    附录:

    Collectors.toMap的重载方法:

    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper) {
        return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
    }
    
    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction) {
        return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
    }
    
    public static <T, K, U, M extends Map<K, U>>
    Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction,
                                Supplier<M> mapSupplier) {
        BiConsumer<M, T> accumulator
                = (map, element) -> map.merge(keyMapper.apply(element),
                                              valueMapper.apply(element), mergeFunction);
        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
    }
    
    展开全文
  • Java中的Map允许重复元素吗?

    万次阅读 2018-06-22 14:37:05
    Java中常见的三个集合接口:List、Set、Map,已经知道List中是允许重复元素的,而Set中是不允许重复元素的,那么Map允许重复元素吗?查阅资料,发现是不可以的,因为map是无序的,它的查询需要通过key的值来...
  • 在java中,有一种key值可以重复map,就是IdentityHashMap。在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 。在正常的Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1 和 k2 ...
  • 1. Map 中的 key允许重复重复就是覆盖    之前讲解的所有 Map 操作中 key 的值是不能重复的,例如,HashMap 操作的时候是不能重复的,如果重复肯定会覆盖之前的内容。 实例 1 代码: package self.learn....
  • Java8 stream操作toMapkey重复问题

    千次阅读 2019-09-16 02:20:02
    方案二: Map的value可以储存一个list,把重复key的值放入list,再存到value中 userList.stream().collect(Collectors.toMap(User::getId, e -> Arrays.asList(e.getUsername()), (List<String> oldList, List...
  • stl中mapkey可以重复吗?

    千次阅读 2020-07-03 18:05:56
    如果需要key值相同那么可以采用multimap,是允许key重复的。 例如: m.insert(make_pair<int, int>(1, 3)); m.insert(make_pair<int, int>(0, 4)); m.insert(make_pair<int, int>(0, 2)); MyMap...
  • 点击上方“Coder编程”,选择“置顶公众号”技术文章第一时间送达!最近项目中在使用JDK8中toMap方法遇到因key相同而导致toMap报错的情况。报Duplicate key xx...
  • google guava 重复keyMap范例使用

    千次阅读 2016-06-02 16:38:52
     博主最近做项目时,遇到了及其复杂的集合,对象转换工作,大量用到了Map,List等,尤其是Map,类似会出现Map,Map>这样的情况出现。而我毫无办法。因为往往是两个主键对应了一个信息组,不知道大家有没有遇到过,举...
  • C++ STL中允许重复key的multimap

    千次阅读 2016-10-30 22:09:00
    在实际的项目中可能会碰到key重复的情况,正常的MAP类型是不允许重复的key,所以就要使用multimap了,multimap的使用和map基本类似,可以无缝对接 #include &lt;map&gt;   typedef pair&lt;string, int...
  • 这个确实是不允许重复的,虽然unordered_map的底层是哈希表,但是可能哈希里面是map,所以我大胆猜测map类的都是不允许键值重复的。
  • 此类利用哈希表实现Map接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在IdentityHashMap中,当且仅当(k1==k2)时,才认为两个键k1和k2相等(在正常Map实现(如HashMap)中,当且仅当满足下列条件时...
  • JSON对于map重复Key,转换过程中会报错!具体代码如下,附带报错信息 package com.fjnx.history.collection; import com.alibaba.fastjson.JSONObject; import java.util.*; /** * Created with IntelliJ IDEA...
  • Map中如何实现key唯一不重复

    万次阅读 2017-04-18 11:15:23
    Map中如何实现key唯一不重复 问题:如何做到Mapkey唯一不重复,每次都遍历来equals比较吗? 首先,答案是否。如果全部遍历的话,当Map中元素很多的时候,显然查询效率低。 解释: HashMap属于...
  • 19.允许重复的unordered_map

    千次阅读 2018-03-23 12:33:00
    1 #include <string> 2 #include <iostream>... 4 //允许重复的,hash_map 5 #include <unordered_map> 6 #include <algorithm> 7 using namespace std; 8 9 10 vo...
  • java HashMap插入重复Key值问题

    千次阅读 2019-12-09 08:55:34
    Map里面存放的每一个元素都是key-value这样的键值对,而且都是通过put方法进行添加的,而且相同的keyMap中只会有一个与之关联的value存在。put方法在Map中的定义如下。 V put(K key, V value); put()方法实现...
  • Map集合详细解析

    千次阅读 2019-09-23 20:38:10
    Map java 集合 API 中的Map是映射的意思 Map是一个接口,其目的是为了高性能解决查找问题 实现Map接口的类都封装了高性能查找算法,利用Map接口的实现类就可以提高软件的查 找性能,提供优秀的用户体验 Map的实现...
  • 可以存储相同keymap——Multimap

    千次阅读 2014-10-23 17:32:34
     Multimap允许key重复Map是不允许的,若在装入Map时,出现相同key,后者会将前者覆盖)。  2. 判断两个集合是否存在交集:!Collections.disjoint(list1, list2);  或!CollectionUtils.containsAny(list1,...
  • 如何在Java的Map中存储重复键?

    千次阅读 2019-01-31 09:30:19
    在本教程中,我们将探讨用于处理具有重复键的Map的可用选项,或者换言之,允许为单个键存储多个值的Map。 2.标准Map Java有几个接口Map的实现,每个都有自己的特殊性。 但是,现有的Java核心Map实现都不允许Map处理...
  • C++ Map相同key是否覆盖问题分析

    千次阅读 2020-04-29 16:29:27
    C++的标准库关联容器map是不允许key相同的键值对存在的。那么当key已经存在的情况下,我们再次插入相同的key,那么key的value会被覆盖吗? 2 编码测试 测试代码: #include <map> #include <string>...
  • 1.问题:当map插入数据时,如果key值相同,value值是覆盖么? 答:如果keymap里面有的话,不会覆盖之前的value,一般先判断之前有没有数据(见4.),有的话,先删除,再去添加。还有一种方法,可以通过value = map...
  • C++判断mapkey值是否存在

    万次阅读 2019-04-15 22:07:03
    count函数用于统计key值在map中出现的次数,mapkey允许重复,因此如果key存在返回1,不存在返回0 if (testMap.count(key) == 0) cout << "no this key" << endl; 2、find函数 iterator find...
  • 应该有很多人不知道IdentityHashMap的存在,其中不乏工作很多年的Java开发者,会有很多人以为这是第...其实我们对Map都有一个通用认知:只要key相同,就不能重复往里面put,但是你真的了解“相同”这两个字吗?看下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,261
精华内容 45,704
关键字:

允许key重复的map