1.基本概念
- Map接口在java.util包下;
- Map是双列集合,将键映射到值Map<K, V>;Collection是单列集合;
- 一个映射不能包含重复的键,每个键只能映射一个值,值可以重复。
2.子类
- HashMap:底层是哈希表,不保证映射顺序恒久不变,无序的集合,存和取的顺序有可能不一致;不同步,线程不安全,多线程,速度快;JDK 1.8之前是数组+单向链表;JDK 1.8之后是数组+单向链表/红黑树(使用红黑树的情况是链表的长度超过 8,使用红黑树是为了提高查询的速度);可以存储null值、null键;会自动根据key来排序。
- LinkedHashMap:是HashMap的子类,底层是哈希表+链表,有序;
- Hashtable:底层是哈希表,键和值不能为null,之前的所有集合都可以存储null值和null键;是最早期的双列集合;是同步的,线程安全,单线程,速度慢;Hashtable和Vector在jdk1.2后被更先进的集合(HashMap和ArrayList)取代,但Hashtable的子类Properties(是唯一个与IO流相结合的集合)依然在用。
3.常用方法
- V put(K key, V value):将指定的键和值放到集合中,存储键值对的时候,若key不重复,则返回null,若key重复,则用新的value替换已存在的value,返回替换前旧的vaule;
- V remove(K key):将指定的键和对应的值移除,返回被移除的值,若key存在,则返回被移除的值,若key不存在,则返回null;尽量使用包装类,少用基本数据类型,防止空指针异常;
- V get(K key):通过键来获取值,若key存在,返回对应的value值,若key不存在,返回null;
- boolean containsKey(K key):判断集合中是否包含指定的键,包含返回true,不包含返回false;
- boolean containsValue(V value):判断集合中是否包含指定的值;
- Set<K> keySet():获取map集合中的所有键,存储到set集合中;
- Set<Map.Entry<K, V>> entrySet():获取map集合中所有键值对对象的集合(Set集合)。
4.Entry键值对对象
- 一对键值对对象被称为一个Entry,在遍历map集合时,就可以从每一个Entry键值对对象中取出每个对象对应的键和对应的值getKey()、getValue();
- Entry是Map的一个嵌套的内部接口,Map集合一旦创建,就会在Map集合中创建一个Entry对象,用于记录键与值的映射关系,称作键值对对象,类比结婚证。
5.遍历步骤
- 使用Map集合中的方法EntrySet(),把Map集合中的所有键值对对象(Entry对象)取出来,存储至Set集合;
- 遍历Set集合(迭代器或增强for循环),获取每一个Entry对象;
- 使用Entry的方法getKey()和getValue()获取键和值。
6.Map存储自定义类型元素
- 作为key的自定义类型必须重写hashCode方法和equals方法,以保证key唯一。
7.JDK 9对集合的优化
- List、Set、Map接口增加了of方法,一次性给集合添加多个元素;List.of("a", "b", "c");
- 但有一个前提:集合元素的个数确定不再改变;
- of方法只适用于List、Set、Map接口,这些接口的实现类不能用;
- of方法的返回值是一个不能改变的集合,集合不能再使用add或put方法,否则抛出异常;
- Set接口和Map接口在调用of方法时,不能有重复的元素,否则会抛出异常。