一、双列集合(Map)

1.1 双列集合的特点

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

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

特性说明
键唯一性同一个 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 无序(除 LinkedHashSetHashMap 无序,LinkedHashMap/TreeMap 有序
是否允许重复List 允许,Set 不允许键不允许重复,值允许重复
是否允许 nullList/Set 一般允许(TreeSet 除外)视实现类而定(见下表)
典型实现ArrayListLinkedListHashSetTreeSetHashMapLinkedHashMapTreeMap
访问方式迭代器、索引(List)、增强 for通过 key 获取 value,或遍历 entrySet
底层结构数组、链表、红黑树、哈希表等哈希表、红黑树、双向链表等

1.2 常见的API

Map是最顶层的接口类。

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 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()方法依次得到每一个键所对应的值。

    public static void main(String[] args) {
        /*Map集合的遍历方式*/
        // 1、创建Map集合
        Map map = new HashMap<>();
        // 2、添加元素
        map.put("001", "张三");
        map.put("002", "李四");
        map.put("003", "王五");
        // 3、遍历方式一:键找值
        // ① 获取所有的键,把这些键放到一个Set集合中
        // Ctrl+Alt+V : 自动生成变量
        Set keySet = map.keySet();
        // ② 遍历单列set集合,得到每一个键
        // 增强for循环
        for (String key : keySet) {
            // ③ 通过键,获取值
            String value = map.get(key);
            System.out.println(key + "=" + value);
        }
        // 迭代器循环
        Iterator 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()方法获取里面的值。

    public static void main(String[] args) {
        /*Map集合的遍历方式2——键值对*/
        // 1、创建Map集合
        Map map = new HashMap<>();
        // 2、添加键值对
        map.put("张三", "001");
        map.put("李四", "002");
        map.put("老五", "003");
        // 3、遍历方式2——通过键值对
        // 3.1 Entry是Map里面的内部接口
        Set> entrySet = map.entrySet();
        // 3.2 遍历entrySet集合,去得到每一个键值对
        // 增强for
        for (Map.Entry entry : entrySet) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
        System.out.println("--------------------------------");
        // 迭代器
        Iterator> iterator = entrySet.iterator();
        while(iterator.hasNext()){
            Map.Entry 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表达式

    public static void main(String[] args) {
        /*Map集合的遍历方式3——Lambda*/
        // 1、创建Map集合
        Map map = new HashMap<>();
        // 2、添加元素
        map.put("001", "张三");
        map.put("002", "李四");
        map.put("003", "王五");
        // 3、遍历方式3——Lambda
        map.forEach(new BiConsumer() {
            @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的教学内容!!!

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