前言
上一篇博客完整讲解了 Set 三大实现类、底层原理以及 Collections 工具类,本篇学习双列集合 Map,Map 用于存储一一对应的键值对数据,包含基础概念、通用 API、三种遍历方式、三大实现类底层结构与实战案例。
一、Map 集合基础介绍
1. 集合体系划分
单列集合 Collection:一次存储单个元素(ArrayList、HashSet 等)双列集合 Map:一次存储一组key=value键值对,和 Collection 无继承关系Map 三大实现类:HashMap、LinkedHashMap、TreeMap
2. Map 核心特性
- 存储单元:键值对(Entry 对象),key 与 value 一一对应
- 键 key:无索引、不可重复;值 value:允许重复
- 使用场景:需要一一映射的数据,例如用户名 - 密码、省份 - 城市、字符 - 出现次数
3. 三大实现类核心区别
- HashMap:键无序、唯一,底层哈希表,日常开发最常用
- LinkedHashMap:键有序、唯一,哈希表 + 双向链表,保留存入顺序
- TreeMap:键自动排序、唯一,底层红黑树,按键升序排列
二、Map 通用基础 API
所有 Map 子类共用以下方法:
| 方法 | 功能说明 |
|---|---|
V put(K key,V value) | 添加 / 覆盖键值对;key 已存在则覆盖旧 value,返回旧值 |
V remove(Object key) | 根据键删除整条键值对,返回被删除的值 |
void clear() | 清空集合所有键值对 |
boolean containsKey(Object key) | 判断是否存在指定键 |
boolean containsValue(Object value) | 判断是否存在指定值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 获取键值对总数量 |
三、Map 三种遍历方式
方式 1:keySet 键找值
思路:先获取全部 key,再循环通过 key 获取 value
import java.util.HashMap;
import java.util.Set;
import java.util.Map;
public class MapTest1 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("张三","北京");
map.put("李四","上海");
map.put("王五","成都");
// 1. 获取所有键
Set<String> keys = map.keySet();
// 2. 遍历键集合
for(String key : keys){
String value = map.get(key);
System.out.println(key + ":" + value);
}
}
}
方式 2:entrySet 获取键值对对象
思路:将每一组 key-value 封装为 Entry 对象,一次性获取键和值
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for(Map.Entry<String,String> entry : entry){
String k = entry.getKey();
String v = entry.getValue();
System.out.println(k + "=" + v);
}
方式 3:forEach 函数式遍历(JDK8)
最简写法,底层接收 BiConsumer,直接拿到 key 和 value
map.forEach((k,v)-> System.out.println(k + "->" + v));
四、Map 三大实现类底层原理
1. HashMap(开发首选)
- 底层结构:哈希表,与 HashSet 底层完全一致,存储单元为 Entry 键值对
- 初始化规则:默认数组长度 16,加载因子 0.75,元素达到 12 自动扩容 2 倍
- 存储规则:仅根据 key 计算哈希值,value 不参与哈希计算
- 树化规则:链表长度超过 8 且数组长度≥64,链表转为红黑树提升查询速度
- 注意:自定义对象作为 key,必须同时重写
hashCode()与equals(),否则无法去重
2. LinkedHashMap
底层 = 哈希表 + 双向链表;双向链表记录 key 存入顺序,存取有序,其余特性和 HashMap 完全相同。
3. TreeMap
底层红黑树,仅对 key 进行排序;key 必须实现 Comparable,或创建 TreeMap 时传入 Comparator 比较器,否则运行报错。
统一总结
双列集合底层结构只作用于键 key,value 无存储结构限制:
- HashMap:键→哈希表,无序唯一
- LinkedHashMap:键→哈希表 + 双向链表,有序唯一
- TreeMap:键→红黑树,排序唯一
五、实战练习案例
案例 1:统计字符串字符出现次数
需求:字符串aababcabcdabcde,输出格式a(5)b(4)c(3)d(2)e(1)思路:使用 TreeMap,key 存字符自动排序,value 记录出现次数。
案例 2:集合嵌套
需求:Map<String, List<String>>,键是省份名称,值是多个城市组成的 List 集合,遍历输出:
江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
四川省 = 成都市,绵阳市,自贡市,攀枝花市,泸州市
六、全篇总复习(单列 + 集合选型总结)
- 需要元素可重复、大量查询:ArrayList(数组)
- 元素可重复、频繁首尾增删:LinkedList(双向链表)
- 单纯去重、不要求顺序:HashSet / HashMap
- 去重且保留存入顺序:LinkedHashSet / LinkedHashMap
- 元素 / 键需要自动排序:TreeSet / TreeMap
- 批量操作集合使用工具类 Collections,支持批量添加、打乱、排序、取最值
868

被折叠的 条评论
为什么被折叠?



