一、前言
集合按照其存储结构可以分为两大类,分别是单列集合 java.util.Collection
和双列集合 java.util.Map
,单列集合我们在 Java 集合(一) 和 Java 集合(二)中已经讲了,今天我们来讲双列集合 Map
。
二、Map 集合
2.1、Map 集合概述
现实生活中,我们常会看到这样的一种集合:学生与学号,身份证号与个人,这种一一对应的关系,就叫做映射。Java
提供了专门的集合类用来存放这种对象关系,即 java.util.Map
接口。我们来看一下 Map
集合和 Collection
集合的区别:
Collection
中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储。Map
中的集合,元素是成对存在的。每个元素由键与值两部分组成,通过键可以找到对应的值。Collection
中的集合称为单列集合,Map
中的集合称为双列集合。- 需要注意的是,
Map
中的集合不能包含重复的键,值可以重复,每个键只能对应一个值。
Map 接口中的集合都有两个泛型变量 <K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量 <K,V> 的数据类型可以相同,也可以不同。
2.2、Map 接口常用实现类
Map
有多个子类,这里我们主要讲解常用的 HashMap
集合和 LinkedHashMap
集合。
HashMap<K,V>
:存储数据采用的是哈希表结构,元素的存取顺序有可能不一致(无序)。由于要保证键的唯一、不重复,需要重写键的hashCode()
方法和equals()
方法。LinkedHashMap<K,V>
:HashMap
下有个子类LinkedHashMap
,存储数据采用的是哈希表结构 + 链表结构。通过链表结构可以保证元素的存取顺序一致,通过哈希表结构可以保证键的唯一、不重复,需要重写键的hashCode()
方法和equals()
方法。
可以类比 HashSet 和 LinkedHashSet。
2.3、Map 接口中的常用方法
Map
接口中定义了很多方法,常用的如下:
public V put(K key, V value)
: 把指定的键与指定的值添加到Map
集合中,存储键值对的时候如果key
不重复,返回值v
是null
,如果key
重复,返回值v
是 被替换的value
值。private static void show01() { // 创建 Map 集合 Map<String, String> map = new HashMap<>(); String v1 = map.put("至尊宝", "晶晶"); System.out.println(v1); // 返回 null // 这时候 晶晶 会被 紫霞仙子 替换,返回被替换的 value 值 晶晶 String v2 = map.put("至尊宝", "紫霞仙子"); System.out.println(v2); // 返回 晶晶 System.out.println(map); // 返回 {至尊宝=紫霞仙子} // key 不允许重复,value 可以重复 map.put("孙悟空", "紫霞仙子"); System.out.println(map); // 返回 {至尊宝=紫霞仙子, 孙悟空=紫霞仙子} }
public V remove(Object key)
: 将指定的键所对应的元素在Map
集合中删除,返回被删除元素的值。private static void show02() { Map<String, Integer> map = new HashMap<>(); map.put("王祖贤", 175); map.put("林青霞", 168); map.put("李嘉欣", 172); System.out.println(map); // 返回 {林青霞=168, 李嘉欣=172, 王祖贤=175} Integer v1 = map.remove("李嘉欣"); System.out.println(v1); // 返回 172 System.out.println(map); // 返回 {林青霞=168, 王祖贤=175} Integer v2 = map.remove("李嘉诚"); System.out.println(v2); // 返回 null System.out.println(map); // 返回 {林青霞=168, 王祖贤=175} }
public V get(Object key)
根据指定的键,在Map
集合中获取对应的值。private static void show03() { Map<String, String> map = new HashMap<>(); map.put("邓超", "孙俪"); map.put("吴奇隆", "刘诗诗"); map.put("黄晓明", "杨颖"); String v1 = map.get("吴奇隆"); // 返回 刘诗诗 System.out.println(v1); String v2 = map.get("胡歌"); // 返回 null System.out.println(v2); }
boolean containsKey(Object key)
判断集合中是否包含指定的键。private static void show04() { Map<String, String> map = new HashMap<>(); map.put("邓超"