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 List<Map>集合根据相同key分组进行某项数据求和
Java中的集合MapHashMapHashtablePropertiesSortedMapTreeMapWeakHashMapIdentityHashMapEnumMap