Java进阶——集合进阶(MAP)

一、双列集合**(Map)**

1.1 双列集合的特点

在 Java 中,双列集合(Map) 是一种用于存储 "键-值对"(Key-Value Pair) 的数据结构,其中每个键(Key)唯一,通过键可以快速检索对应的值(Value)。它是 Java 集合框架中与单列集合(如 List、Set)并列的重要组成部分。

红色的我们称之为"键",蓝色的我们称之为"值"。键和值一一对应。

特性 说明
键唯一性 同一个 Map 中,任意两个键不能相等(通过 equals() 判断)
值可重复 多个键可以对应相同的值
无索引概念 不像 List 那样通过下标访问,而是通过 键 查找值
非 Collection 子接口 Map 与 Collection 并列,不属于 List/Set 体系
支持泛型 可指定键和值的类型,如 Map<String, Integer>
允许 null(视实现而定) 如 HashMap 允许一个 null 键和多个 null 值

💡 本质 :Map 是一种 "关联数组" 或 "字典" 结构,强调 "通过标识快速定位数据"。

维度 单列集合(Collection) 双列集合(Map)
顶层接口 Collection<E> Map<K, V>
元素形式 单个对象(如 "Alice") 键值对(如 "name" → "Alice")
是否有序 List 有序,Set 无序(除 LinkedHashSet) HashMap 无序,LinkedHashMap/TreeMap 有序
是否允许重复 List 允许,Set 不允许 键不允许重复,值允许重复
是否允许 null List/Set 一般允许(TreeSet 除外) 视实现类而定(见下表)
典型实现 ArrayList, LinkedList, HashSet, TreeSet HashMap, LinkedHashMap, TreeMap
访问方式 迭代器、索引(List)、增强 for 通过 key 获取 value,或遍历 entrySet
底层结构 数组、链表、红黑树、哈希表等 哈希表、红黑树、双向链表等

1.2 常见的API

Map是最顶层的接口类。

java 复制代码
package com.lkbhua.Demo;

import java.util.HashMap;
import java.util.Map;

public class demo1 {
    public static void main(String[] args) {
        /*
            V put(K key , V value)                  添加元素
            V remove(Object key)                    根据键删除键值对元素
            void clear()                            移除所有的键值对元素
            boolean containsKey(Object key)         判断集合是否包含指定的键
            boolean containsValue(Object Value)     判断集合是否包含指定的键
            boolean isEmpty()                       判断集合是否为空
            int size()                              集合的长度,也就是集合中键值对的个数
         */

        // 1、创建Map集合对象
        Map<String,String> map = new HashMap<>();

        // 2、添加元素
        // V put(K key , V value)                  添加元素
        // put()细节:
        // 添加/覆盖
        // 在添加的时候,如果添加的键已经存在,那么会覆盖原来的值
        // 并且将被覆盖的值进行返回。
        // 在添加的时候,如果添加的键不存在,那么添加键值对元素
        map.put("lkbHua","zengQ");
        map.put("西红柿","鸡蛋");
        map.put("豆浆","油条");


        // 3、打印集合
        System.out.println(map);

        // 4、删除元素
        // V remove(Object key)
        String remove = map.remove("西红柿");
        System.out.println(remove);

        // 5、清空集合
        // 没有返回值
        map.clear();

        // 6、判断是否包含
        map.put("西红柿","鸡蛋");
        boolean containsKey = map.containsKey("西红柿");
        System.out.println(containsKey);

        // 7、判断是否为空
        boolean empty = map.isEmpty();
        System.out.println(empty);

        // 8、获取集合的长度
        int size = map.size();
        System.out.println(size);

    }
}

1.3 Map集合的三种遍历方式

1.3.1 键找值

第一步:可以把所有的键都放到一个单列集合当中;

第二部:依次遍历每一个键;

第三步:通过get()方法依次得到每一个键所对应的值。

java 复制代码
    public static void main(String[] args) {
        /*Map集合的遍历方式*/

        // 1、创建Map集合
        Map<String, String> map = new HashMap<>();

        // 2、添加元素
        map.put("001", "张三");
        map.put("002", "李四");
        map.put("003", "王五");

        // 3、遍历方式一:键找值
        // ① 获取所有的键,把这些键放到一个Set集合中
        // Ctrl+Alt+V : 自动生成变量
        Set<String> keySet = map.keySet();
        // ② 遍历单列set集合,得到每一个键
        // 增强for循环
        for (String key : keySet) {
            // ③ 通过键,获取值
            String value = map.get(key);
            System.out.println(key + "=" + value);
        }

        // 迭代器循环
        Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            String value = map.get(key);
            System.out.println(key + "=" + value);
        }
        System.out.println("--------------------------------");

        // 利用Lambda表达式
        keySet.forEach(key -> {
            String value = map.get(key);
            System.out.println(key + "=" + value);
            System.out.println("--------------------------------");
        });

1.3.2 键值对

第一步:依次获取里面的每一个键值对对象;

第二步:通过getKey()方法获取里面的键;通过getValue()方法获取里面的值。

java 复制代码
    public static void main(String[] args) {
        /*Map集合的遍历方式2------键值对*/

        // 1、创建Map集合
        Map<String, String> map = new HashMap<>();

        // 2、添加键值对
        map.put("张三", "001");
        map.put("李四", "002");
        map.put("老五", "003");

        // 3、遍历方式2------通过键值对
        // 3.1 Entry是Map里面的内部接口
        Set<Map.Entry<String, String>> entrySet = map.entrySet();

        // 3.2 遍历entrySet集合,去得到每一个键值对
        // 增强for
        for (Map.Entry<String, String> entry : entrySet) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }

        System.out.println("--------------------------------");

        // 迭代器
        Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
        while(iterator.hasNext()){
            Map.Entry<String, String> entry = iterator.next();
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
        System.out.println("--------------------------------");
        
        // Lambda
        entrySet.forEach(entry -> {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        });
        
        System.out.println("--------------------------------");
    }

1.3.3 Lambda表达式

java 复制代码
    public static void main(String[] args) {
        /*Map集合的遍历方式3------Lambda*/

        // 1、创建Map集合
        Map<String, String> map = new HashMap<>();

        // 2、添加元素
        map.put("001", "张三");
        map.put("002", "李四");
        map.put("003", "王五");

        // 3、遍历方式3------Lambda
        map.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String key, String value) {
                System.out.println(key + ":" + value);
            }
        });

        System.out.println("--------------------------------");

        map.forEach((key,value)->System.out.println(key + ":" + value));
    }

声明:

详细分析借鉴于通义AI

以上均来源于B站@ITheima的教学内容!!!

本人跟着视频内容学习,整理知识引用

相关推荐
上下求索,莫负韶华6 小时前
Spring全家桶
java·后端·spring
优化Henry6 小时前
LTE站点以太网光模块告警处理实践
运维·网络·笔记·学习·信息与通信
w_zero_one6 小时前
链表(2)
java·数据结构·链表
白杨尚青6 小时前
C++入门篇(十一):string(中)——容量与增删改查:一篇吃透所有常用接口(万字详解)
java·开发语言·c++
老歌老听老掉牙6 小时前
旅行商问题:从数学模型到 Python 实战
开发语言·python
CC数分6 小时前
数据可视化入门:用Python把一堆数字变成一张图
开发语言·python·信息可视化·数据分析
java_nnnn6 小时前
JavaEE进阶-JavaScript初识
开发语言·前端·javascript·java-ee·ecmascript
职豚求职小程序7 小时前
27届携程笔试测评|能力测评+英语测评高分过
笔记
SimonKing7 小时前
SSE、WebSocket 连接丢 Redis 里?那可踩大坑了!
java·后端·程序员
倔强的石头1067 小时前
【Linux指南】动静态库系列(九):动态库如何进入进程地址空间:从磁盘 .so 到共享内存映射
java·linux·服务器