【从零开始学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 接口实现的数据结构。与单列集合(如 ListSet,每次只存入一个独立元素)不同,双列集合每次存储的都是一对具有关联关系的数据。

一、双列集合的特点

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);
            }
        });
    }
}

😎😎😎😎

相关推荐
kkeeper~4 小时前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
一直不明飞行4 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker4 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
盲敲代码的阿豪5 小时前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
你的保护色5 小时前
【无标题】
java·服务器·网络
basketball6165 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
互联科技报5 小时前
2026超融合选型:Top5品牌与市场格局解读
开发语言·perl
weixin199701080165 小时前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
淘矿人6 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
想唱rap6 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++