← [ BACK_TO_NOTES ]

Java 集合框架概览

List/Set/Map 的职责分工、常用实现选型、迭代与并发边界入口。

#concept #growing #dev #java

[!info] related notes

Java 集合框架概览

这个概念为什么出现

真实业务很少只操作单个变量:购物车行、SKU 索引、去重标签、配置字典都需要集合。Java 集合框架用接口 + 实现分离“契约”与“数据结构选择”。

[!abstract] 一句话理解 List 有序可重复,Set 去重,Map 键值索引;先选接口语义,再选 ArrayList/HashSet/HashMap 等实现,并遵守元素 equals/hashCode 契约。

最小可运行示例

场景:购物车维护商品行与优惠标签

import java.util.*;

public class CartCollections {
    public static void main(String[] args) {
        List<String> lines = new ArrayList<>();
        lines.add("SKU-1");
        lines.add("SKU-1"); // List 允许重复
        System.out.println("lines=" + lines.size());

        Set<String> tags = new HashSet<>();
        tags.add("promo");
        tags.add("promo"); // Set 去重
        System.out.println("tags=" + tags.size());

        Map<String, Integer> stock = new HashMap<>();
        stock.put("SKU-1", 3);
        stock.put("SKU-2", 0);
        System.out.println("SKU-1=" + stock.get("SKU-1"));
        System.out.println("missing=" + stock.get("SKU-9")); // null
    }
}

建议运行:

javac CartCollections.java && java CartCollections

期望输出:

lines=2
tags=1
SKU-1=3
missing=null

结合场景再看三个关注点

  1. 接口类型声明变量(List/Map),实现可替换。
  2. Map 未命中返回 null;允许 null 值的映射也可返回 null。getOrDefault 只在键不存在时返回默认值,不能替换已映射的 null。
  3. HashSet 去重依赖 equals/hashCode;TreeSet/TreeMap 以自然顺序或比较器的 compare == 0 判断元素/键重复。排序需与 equals 一致才能遵守通常的 Set/Map 契约。

核心概念与准确模型

1. 核心接口

接口语义
Collection单列集合根
List有序、下标、可重复
Set无重复
Map键值,键唯一;不继承 Collection
Queue/Deque队列/双端

2. 常用实现选型

需求常见选择
随机访问列表ArrayList
队列/双端队列的头尾操作通常先考虑 ArrayDeque(不允许 null)
去重无序HashSet
排序去重TreeSet
键值检索HashMap
键排序TreeMap
保持插入序LinkedHashMap

3. 迭代与修改

  • fail-fast 迭代器在检测到结构修改时可能抛 ConcurrentModificationException,属于尽力检测,不能依赖它保证并发安全。
  • 若迭代器支持,可用其 remove 删除当前元素;也可结束遍历后统一删除。并发集合的迭代契约另见并发集合篇。

4. 不可修改集合与视图

  • List.of/Map.of 及相应 copyOf 不允许修改集合结构,也拒绝 null;元素对象仍可能可变。copyOf 不随源集合后续的结构变化而改变。
  • Collections.unmodifiableList 是只读视图,底层列表的修改仍会反映出来。
  • Arrays.asList 是数组支持的定长列表,允许 set,不支持增删;列表与数组共享元素槽位。

边界情况与反直觉行为

  1. HashMap 允许一个 null 键和 null 值,这是文档约定;Hashtable/ConcurrentHashMap 均不允许 null 键或值。
  2. TreeMap 可使用键的自然顺序或显式比较器;显式比较器下键不必实现 Comparable。自然顺序拒绝 null 键,比较器可自行支持 null。
  3. 集合不是线程安全默认——见并发集合篇。

常见误区

[!warning] 常见误区:返回 null List 返回空列表,避免调用方 NPE。

工程实践

  1. 方法参数尽量用接口类型。
  2. 暴露集合前区分只读视图和不可修改快照;两者都不自动深拷贝可变元素。
  3. 大键对象注意 hash 成本。
  4. 选型先语义后性能,性能靠测量。

本节总结

  • List/Set/Map 语义三分
  • 实现按访问模式选
  • equals/hashCode 与并发边界决定正确性

自测题

  1. 何时用 Set 而不是 List?
  2. 为什么变量写成 List<String> x = new ArrayList<>()?
参考答案
  1. 需要去重/成员测试且不关心重复插入语义时。
  2. 依赖接口契约,便于替换实现与测试。

延伸阅读与资料来源

资料类型支撑内容
Collections Framework Overview官方框架总览
List / Map APIAPI接口契约
创建于 2026/7/15 更新于 2026/10/6
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本