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

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

1.1 双列集合的特点

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

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

特性 说明
键唯一性 同一个 Map 中,任意两个键不能相等(通过 equals() 判断)
值可重复 多个键可以对应相同的值
无索引概念 不像 List 那样通过下标访问,而是通过 查找值
非 Collection 子接口 MapCollection 并列,不属于 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的教学内容!!!

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

相关推荐
代码狂想家2 小时前
Rust 命令行密码管理器工具开发
开发语言·rust·php
u0119608232 小时前
java 不可变集合讲解
java·开发语言
翔云 OCR API2 小时前
NFC护照鉴伪查验流程解析-ICAO9303护照真伪查验接口技术方案
开发语言·人工智能·python·计算机视觉·ocr
2501_941111682 小时前
模板编译期哈希计算
开发语言·c++·算法
Qiuner2 小时前
Spring Boot 进阶:application.properties 与 application.yml 的全方位对比与最佳实践
java·spring boot·后端
寒山李白2 小时前
Mybatis使用教程之XML配置方式实现增删改查
xml·java·mybatis
Creeper.exe2 小时前
【C语言】分支与循环(上)
c语言·开发语言
Seven972 小时前
剑指offer-38、⼆叉树的深度
java
jllllyuz2 小时前
基于粒子群优化(PSO)的特征选择与支持向量机(SVM)分类
开发语言·算法·matlab