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方法时,不能有重复元素否则会抛出异常
来源:https://www.cnblogs.com/zhihaospace/p/12117276.html