java map集合赋值 key值相同覆盖问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java map集合赋值 key值相同覆盖问题相关的知识,希望对你有一定的参考价值。

我要怎么把数据转成这种格式啊?如果用map集合的话 Key值重复会覆盖 list又没有Key值

你需要一个List<Map> 集合,还有一个fastjson.jar包把集合转成json格式 参考技术A Map集合操作put相同key值会覆盖先前的值的。 参考技术B 这不是json么

4.java基础回顾集合3

1.Map集合:

  • java.util.Map<k,v>包中
  • 一个双列集合,一个元素包含两个值(key,value)
  • key和value的数据类型可以相同,也可以不相同
  • key不允许重复,value允许重复
  • key和value一一对应

Map常用子类:

  • HashMap:实现Map<k,v>接口,多线程的
    • JDK1.8之前用数组+单向链表,之后用数组+单向链表/红黑树(数组长度超过8时使用红黑树),提高了查询的速度
    • 无序集合,存储元素和取出元素顺序可能不一致
    • LinkedHashMap:继承HashMap
      • 底层是:哈希表+链表(保证迭代顺序)
      • 有序集合,存储和取出元素顺序一直
  • Hashtable:实现Map<k,v>接口,单线程的
    • JDK1.0就有,较早期的集合
    • 键或值不可以是null
    • 单线程速度慢,已经被HashMap代替了
    • 子类Properties集合:
      • 依然被大量使用
      • 唯一和IO流相结合的集合

Map常用方法::

  • public V put(K key,V value):向Map中添加指定key和value的元素
  • public V remove(Object key):删除指定key的元素,返回删除的元素值
  • public V get(Object key):根据指定key,获取对应value
  • boolean containsKey(Object key):判定Map中是否包含指定key的元素
  • public Set<K> keySet():获取Map集合中所有key,放入Set集合中
  • pubic Set<Map.Entry<K,V>> entrySet():获得所有Map集合中的键值对元素放入Set集合中

注:

  Map.Entry<K,V>:在Map接口中有一个内部接口Entry,当Map集合创建时,内部就会创建一个Entry对象,用于记录键和值对象(保存键和值的映射关系)

 1 public class demo03 {
 2 
 3     public static void main(String[] args) {
 4 
 5         Map<String, String> map = new HashMap<>();
 6 
 7         //1.存入键值对
 8         map.put("key1", "value1");
 9         map.put("key2", "value2");
10         map.put("key3", "value3");
11         map.put("key4", "value4");
12 
13         System.out.println(map);
14 
15         //2.删除对应key的键值对
16         map.remove("key1");
17         System.out.println(map);
18 
19         //3.获得对应key的value值
20         System.out.println(map.get("key3"));
21 
22         //4.判断是否包含对应key的键值对
23         System.out.println(map.containsKey("key5"));
24 
25         //5.遍历Map中的所有key,方法一
26         Set<String> set = map.keySet();
27 
28         Iterator<String> iterator = set.iterator();
29         while (iterator.hasNext()) {
30             System.out.println(iterator.next());
31         }
32 
33         //遍历Map中的所有key,方法二
34 //        for (String s: map.keySet()
35 //             ) {
36 //            System.out.println(s);
37 //        }
38 
39         //6.遍历Map中所有的键值对对象,方法一
40         Set<Map.Entry<String,String>> set2 = map.entrySet();
41 
42         Iterator<Map.Entry<String,String>> iterator2 = set2.iterator();
43         while (iterator2.hasNext()){
44             System.out.println(iterator2.next());
45         }
46 
47         //遍历Map中所有的键值对对象,方法二
48 //        for (Map.Entry<String,String> entry: map.entrySet()
49 //             ) {
50 //            System.out.println(entry);
51 //        }
52 
53     }
54 }

使用HashMap来存储自定义类型:

  • 如果自定义类型作为key,则必须重写hashcode方法和equals方法,用来保证key唯一
  • 如果Java自带类型例如String作为key时,则不用,由于String已经重写过了这两个方法
 1 public class demo04 {
 2 
 3     public static void main(String[] args) {
 4 
 5         HashMap<Person,String> hashMap = new HashMap<>();
 6 
 7         hashMap.put(new Person("wzh",24),"person1");
 8         hashMap.put(new Person("wzh",24),"person2");
 9         hashMap.put(new Person("wxl",23),"person3");
10         hashMap.put(new Person("wzl",23),"person4");
11 
12         for (Map.Entry<Person,String> entry: hashMap.entrySet()
13              ) {
14             System.out.println(entry);
15         }
16 
17         /**
18          * 输出
19          * Person{name=‘wzh‘, age=24}=person2
20          * Person{name=‘wzl‘, age=23}=person4
21          * Person{name=‘wxl‘, age=23}=person3
22          */
23     }
24 }

使用LinkedHashMap:存取顺序相同

 1 public class demo05 {
 2 
 3     public static void main(String[] args) {
 4 
 5         HashMap<String,String> hashMap = new HashMap<>();
 6 
 7         hashMap.put("key3","value3");
 8         hashMap.put("key2","value2");
 9         hashMap.put("key4","value4");
10         hashMap.put("key1","value1");
11 
12         //存取顺序不相同
13         System.out.println(hashMap);    //{key1=value1, key2=value2, key3=value3, key4=value4}
14 
15         LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<>();
16 
17         linkedHashMap.put("key3","value3");
18         linkedHashMap.put("key2","value2");
19         linkedHashMap.put("key4","value4");
20         linkedHashMap.put("key1","value1");
21 
22         //存取顺序相同
23         System.out.println(linkedHashMap);  //{key3=value3, key2=value2, key4=value4, key1=value1}
24     }
25 }

2.JDK9的新特性

集合中新增of方法:

  • List接口,Set接口,Map接口增加一个静态方法of,用于一次性给集合添加多个元素,不适用于接口的实现类
  • 使用of方法后不能再向集合中添加元素,不能调用add,put方法否则会抛出异常
  • 对于Set接口和Map接口使用of方法时,不能有重复元素否则会抛出异常

 

  

以上是关于java map集合赋值 key值相同覆盖问题的主要内容,如果未能解决你的问题,请参考以下文章

Java中的Map集合

java map中相同的key保存多个value值方式

Java学习笔记之:Java Map集合

Java List<Map>集合根据相同key分组进行某项数据求和

Java中的集合MapHashMapHashtablePropertiesSortedMapTreeMapWeakHashMapIdentityHashMapEnumMap

集合知识点