【从零开始学Java | 第二十六篇】双列集合(Map)

目录

前言

一、双列集合的特点

[1. 键值对(Key-Value)存储](#1. 键值对(Key-Value)存储)

[2. 键(Key)的唯一性](#2. 键(Key)的唯一性)

[3. 值(Value)的可重复性](#3. 值(Value)的可重复性)

[4. 单向的映射关系](#4. 单向的映射关系)

[5. 顺序的差异化(根据具体实现类而定)](#5. 顺序的差异化(根据具体实现类而定))

二、双列集合Map常用的API

[put(K key, V value)](#put(K key, V value))

三、Map的遍历方式

1.键找值遍历

2.键值对遍历

3.Lambda表达式


前言

在之前学习了单列集合Collection接口,现在我们要学习的是Map双列集合,我们常说的双列集合 通常指的是基于 Map 接口实现的数据结构。与单列集合(如 List、Set,每次只存入一个独立元素)不同,双列集合每次存储的都是一对具有关联关系的数据。

一、双列集合的特点

1. 键值对(Key-Value)存储

这是双列集合最本质的特征。集合中的每一个元素实际上是一个 Entry(条目),它包含两个部分:

  • Key(键):数据的唯一标识,类似于数据库中的主键、学生的学号或字典里的单词。

  • Value(值):与键相关联的具体数据,类似于学生的具体档案或字典里单词的解释。

2. 键(Key)的唯一性

在一个双列集合中,绝对不允许存在两个完全相同的 Key。

  • 如果你尝试向集合中添加一个已经存在的 Key,系统不会报错,而是会用新的 Value 覆盖掉旧的 Value。

  • 举例 :如果你先存入了 <"001", "张三">,随后又存入 <"001", "李四">,那么键 "001" 对应的值就会被更新为 "李四"。

3. 值(Value)的可重复性

虽然 Key 必须唯一,但不同的 Key 可以映射到完全相同的 Value。

  • 举例 :<"001", "北京"> 和 <"002", "北京"> 可以和谐地共存于同一个集合中(两个不同工号的员工都在北京分公司)。

4. 单向的映射关系

每个 Key 最多只能映射到一个确定的 Value,你通过 Key 可以极快地查找到对应的 Value,但通常不能直接通过 Value 反向高效地查找 Key。

如果你需要一个 Key 对应多个数据,通常需要将 Value 设置为一个单列集合(例如 Map<String, List<String>>)。

5. 顺序的差异化(根据具体实现类而定)

双列集合本身不保证元素的顺序,具体是否有序取决于你使用的底层实现类:

  • 无序集合:如最常用的 HashMap,它存取元素的顺序是不一致的,但它的查找和插入效率最高。

  • 插入有序:如 LinkedHashMap,它可以保证你遍历集合时,元素会按照你当初存入的顺序输出。

  • 大小有序:如 TreeMap,它会根据 Key 的自然顺序(或者你指定的比较器)对所有的键值对进行自动排序。

二、双列集合Map常用的API

方法名 说明
V put(K key, V value) 添加元素
V remove(Object key) 根据键删除键值对元素
void clear() 移除所有键值对元素
boolean containsKey(Object key) 判断集合是否包含指定的键
boolean containsValue(Object value) 判断集合是否包含指定的值
boolean isEmpty() 判断集合是否为空
int size() 集合的长度,也就是集合中键值对的个数

put(K key, V value)

put方法的细节:添加/覆盖

  • 在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合中,方法返回null
  • 如果键已经存在,那么会把原有的键值对对象覆盖,会把覆盖的值进行返回。
java 复制代码
public class Test {
    public static void main(String[] args) {
        Map<String, Integer> m = new HashMap<>();

        
        Integer value1 = m.put("张三", 18);
        System.out.println(value1);
        m.put("李四", 20);
        m.put("王五", 22);

        Integer value2 = m.put("王五", 25);
        System.out.println(value2);

        System.out.println(m);
    }
}

三、Map的遍历方式

Map有三种遍历方式:

  • 键找值
  • 键值对
  • Lambda表达式

1.键找值遍历

主要是通过**get(K key)**方法通过键获取对应的值。

java 复制代码
public class Test {
    public static void main(String[] args) {
        Map<String, Integer> m = new HashMap<>();


        m.put("张三", 18);
        m.put("李四", 20);
        m.put("王五", 22);
        //将map中的键,放入单列集合中
        Set<String> s = m.keySet();
        //通过单列集合中的键找值
        s.forEach(key-> {
                Integer value = m.get(key);
                System.out.println(key + "=" + value);
        });
    }
}

2.键值对遍历

核心思路是通过获取Map集合中的entry来间接获取键和值。

java 复制代码
public class Test {
    public static void main(String[] args) {
        Map<String, Integer> m = new HashMap<>();
        m.put("zhangsan", 13);
        m.put("lisi", 24);
        m.put("wangwu", 35);

        //通过键值对遍历
        Set<Map.Entry<String, Integer>> entries = m.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            String key = entry.getKey();
            int value = entry.getValue();
            System.out.println(key + " = " + value);
        }
    }
}

3.Lambda表达式

java 复制代码
public class Test {
    public static void main(String[] args) {
        Map<String, String> m = new HashMap<>();
        m.put("2026001", "张三");
        m.put("2026002", "李四");
        m.put("2026003", "王五");

        m.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String key, String value) {
                System.out.println(key + " = " + value);
            }
        });
    }
}

😎😎😎😎

相关推荐
apcipot_rain21 分钟前
C++转Java日记(04)
java·开发语言·c++
特立独行的猫A1 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
云和数据.ChenGuang2 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
憧憬成为java架构高手的小白2 小时前
LangGraph4j 实战(下)
java
天诰3 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
蜗牛一步步往上爬5 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
这个昵称不容易6 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长7 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
张张123y7 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
文丑颜不良啊8 小时前
LeetCode2221~2240题目解析
java·leetcode