Java 集合框架概览

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

#type / concept #status / growing #tech / dev #resource / java

[!info] 关联笔记

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(或用 getOrDefault)。
  3. 去重依赖 equals/hashCode

核心概念与准确模型

1. 核心接口

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

2. 常用实现选型

需求常见选择
随机访问列表ArrayList
头尾频繁插入LinkedList(先测量)
去重无序HashSet
排序去重TreeSet
键值检索HashMap
键排序TreeMap
保持插入序LinkedHashMap

3. 迭代与修改

  • for-each 时结构修改可能 ConcurrentModificationException
  • 用迭代器 remove 或收集后删

4. 不可变集合

  • List.of/Map.of/copyOf
  • 返回只读视图防泄漏

边界情况与反直觉行为

  1. HashMap 允许一个 null 键(实现细节层面的常见行为);Hashtable/ConcurrentHashMap 不同。
  2. TreeMap 键必须可比较。
  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/7/15