Java 集合高级(下篇)Map 双列集合完整讲解

前言

上一篇博客完整讲解了 Set 三大实现类、底层原理以及 Collections 工具类,本篇学习双列集合 Map,Map 用于存储一一对应的键值对数据,包含基础概念、通用 API、三种遍历方式、三大实现类底层结构与实战案例。

一、Map 集合基础介绍

1. 集合体系划分

单列集合 Collection:一次存储单个元素(ArrayList、HashSet 等)双列集合 Map:一次存储一组key=value键值对,和 Collection 无继承关系Map 三大实现类:HashMap、LinkedHashMap、TreeMap

2. Map 核心特性

  1. 存储单元:键值对(Entry 对象),key 与 value 一一对应
  2. 键 key:无索引、不可重复;值 value:允许重复
  3. 使用场景:需要一一映射的数据,例如用户名 - 密码、省份 - 城市、字符 - 出现次数

3. 三大实现类核心区别

  1. HashMap:键无序、唯一,底层哈希表,日常开发最常用
  2. LinkedHashMap:键有序、唯一,哈希表 + 双向链表,保留存入顺序
  3. 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(开发首选)

  1. 底层结构:哈希表,与 HashSet 底层完全一致,存储单元为 Entry 键值对
  2. 初始化规则:默认数组长度 16,加载因子 0.75,元素达到 12 自动扩容 2 倍
  3. 存储规则:仅根据 key 计算哈希值,value 不参与哈希计算
  4. 树化规则:链表长度超过 8 且数组长度≥64,链表转为红黑树提升查询速度
  5. 注意:自定义对象作为 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 集合,遍历输出:

江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
四川省 = 成都市,绵阳市,自贡市,攀枝花市,泸州市

六、全篇总复习(单列 + 集合选型总结)

  1. 需要元素可重复、大量查询:ArrayList(数组)
  2. 元素可重复、频繁首尾增删:LinkedList(双向链表)
  3. 单纯去重、不要求顺序:HashSet / HashMap
  4. 去重且保留存入顺序:LinkedHashSet / LinkedHashMap
  5. 元素 / 键需要自动排序:TreeSet / TreeMap
  6. 批量操作集合使用工具类 Collections,支持批量添加、打乱、排序、取最值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值