Java中Collection接口从未定义addFirst()/addLast()方法,JDK 21引入的是SequencedCollection接口(非SequentialCollections),新增getFirst()/getLast()/addFirst()/addLast()等顺序操作。

Java 中 Collection 接口本身从未定义 addFirst() 或 addLast() 方法,JDK 21 也并未引入名为 SequentialCollections 的新接口或机制——这是对 JDK 演进的常见误解。
Collection 接口始终不支持首尾插入操作
Collection 是 Java 集合框架的顶层接口,只声明了通用操作如 add()、remove()、size() 等,其语义是“无序、不保证插入位置”。无论 JDK 版本如何演进(包括 JDK 21),它都不包含 addFirst()、addLast()、getFirst() 等顺序敏感方法。这些方法属于更具体的接口,比如 Deque 或 LinkedList。
JDK 21 并未新增 SequentialCollections 接口
截至 JDK 21(2023年9月发布),官方 API 文档和 JEP 列表中不存在名为 SequentialCollections 的接口、类或 JEP。可能的混淆来源包括:
- 对
SequencedCollection(JEP 431,JDK 21 正式特性)的误记——正确名称是 SequencedCollection,不是 “SequentialCollections”; - 将 Python 或其他语言的术语映射到 Java;
- 混淆了第三方库(如 Eclipse Collections)的命名。
SequencedCollection:JDK 21 的真实新增接口
JDK 21 通过 JEP 431 引入了 SequencedCollection 接口,它是 Collection 的子接口,用于表达“具有明确定义的序列顺序”的集合(如 ArrayList、LinkedHashSet、ArrayDeque 等)。它新增了以下顺序相关方法:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
getFirst()/getLast()—— 获取首尾元素; -
addFirst(E)/addLast(E)—— 在首尾插入元素; -
removeFirst()/removeLast()—— 移除并返回首尾元素; -
reversed()—— 返回一个反向视图(不可变、延迟计算)。
注意:这些方法仅对实现了 SequencedCollection 的具体类有效(例如 ArrayDeque、LinkedHashSet、ArrayList 在 JDK 21 中已实现该接口),但 HashSet 或普通 Collection 变量仍无法调用它们。
实际使用时的关键细节
要使用 addFirst() 或 addLast(),必须:
- 声明变量类型为
SequencedCollection或其子接口(如Deque),而非泛化的Collection; - 确保运行时对象实际支持该行为(例如
new ArrayList()在 JDK 21 中实现了SequencedCollection,但new HashSet()没有); - 理解语义差异:
addLast()对ArrayList相当于add(),而对ArrayDeque则等价于offerLast();addFirst()在ArrayList中会触发数组前移,性能为 O(n)。
不复杂但容易忽略:JDK 21 的改进在于统一抽象顺序行为,而不是改变 Collection 本身——真正的演进发生在接口层级的扩展,而非颠覆原有契约。

















