1.什么是Map
Java里的Map接口是一个集合根接口,表示一个 键值对(Key-Value) 的映射。
简单来说就是键和值是一对的,每一个 Key都有唯一确定的 Value对应。
其中要求 键(Key) 唯一,因为是按照Key去找Value的,如果Key重复,就找不到应该是对应的哪一个Value。
举一个简单的例子就是,每一个学号对应一位学生,那学号与学生姓名就是一对键值对,学号为键,学生为值,学号不能重复,学生姓名可以重复。
因此,Map最重要的特性就是去重,Set底层使用的就是Map集合。
2.Java中的Map
Java中的Map集合是和Collection接口同一等级的集合根接口。
2.1 Java中的Map接口
可以从 Keyset, Values, Entry三个角度来分析Java中的Map接口。
2.1.1 Keyset
KeySet 是一个 Map 中键(key)的集合,以 Set 的形式保存,不允许重复,因此键存储的对象需要重写 equals() 和 hashCode() 方法。
在上图就是保存 AA, BB, CC, DD… 等键的集合,也就是左边的那一列。
可以通过 Map.keySet() 方法获得。
2.1.2 Values
Values 是一个 Map 中值 (value) 的集合,以 Collection 的形式保存,因此可以重复。
在上图就是保存 90,90,56,78… 等值的集合,也就是右边那一列。
通过 Map.values() 方法获得。
2.1.3 Entry
Entry 是 Map 接口中的静态内部接口,表示一个键值对的映射,例如上图中 AA-90 这一组映射关系。
Entry 具有上图中的方法:
- getKey() , 获取这组映射中的键 key
- getValue() , 获取这组映射中的值 value
- setValue() ,修改这组映射中的值
- hashCode() , 返回这个 Entry 的哈希值
- equals() , 对比 key-value 是否相等
通过 Map.entrySet() 方法获得的是一组 Entry 的集合,保存在 Set 中,所以 Map 中的 Entry 也不能重复。
public Set<Map.Entry<K,V>> entrySet();
3.Map 的实现类
Map 的实现类主要有 4 种:
- Hashtable
- 古老,线程安全
- HashMap
- 速度很快,但没有顺序
- TreeMap
- 有序的,效率比 HashMap 低
- LinkedHashMap
- 结合 HashMap 和 TreeMap 的有点,有序的同时效率也不错,仅比 HashMap 慢一点
其中后三个的区别很类似 Set 的实现类:
- HashSet
- TreeSet
- LinkedHashSet
Map 的每个实现类都应该实现 2 个构造方法:
- 无参构造方法,用于创建一个空的 map
- 参数是 Map 的构造方法,用于创建一个包含参数内容的新 map
第二种构造方法允许我们复制一个 map。
虽然没有强制要求,但自定义 Map 实现类时最好都这样来。
参考链接
Java 集合深入理解(14):Map 概述
【Java】Map介绍和使用
Java :集合(4)——Map 用法详解