sequencedcollection 是 java 21 引入的接口,定义首尾高效访问与双向遍历的统一契约;支持 arraydeque、linkedlist 等明确实现该接口的类,不支持 arraylist、hashset 等未实现类;提供 getfirst()/addlast() 等安全操作及 reversed() 惰性逆序视图。

Java 21 引入的 SequencedCollection 接口,不是给所有“有序集合”加个新名字,而是为真正支持**首尾高效访问 + 双向遍历语义**的集合类型,定义了一套统一、安全、可预测的操作契约。它解决的不是“能不能按顺序遍历”,而是“能不能用同一套方法,在任意兼容集合上,干净地取头、取尾、插头、插尾、反转遍历”。
哪些集合真正支持 SequencedCollection?
关键看实现类是否在 JDK 中明确声明实现了该接口,而不是看它“看起来有没有序”。常见情况如下:
- 支持:ArrayDeque、LinkedList、LinkedHashSet、ConcurrentLinkedDeque、LinkedBlockingDeque
- 不支持:ArrayList、HashSet、TreeSet、Vector、Stream.toList() 返回的不可变 List
-
注意:List 接口本身继承了 SequencedCollection,但 ArrayList 等具体实现类并未重写或实现其首尾方法——所以变量类型是
List<string></string>时,getFirst()编译直接失败
首尾操作不再是“手算索引”的危险游戏
过去用 list.get(0) 和 list.get(list.size()-1),既要判空防 IndexOutOfBoundsException,又无法复用于 Deque 或 Set。现在:
-
getFirst()/getLast():语义清晰,空集合抛NoSuchElementException(非 NPE),便于区分逻辑错误与空状态 -
addFirst()/addLast():统一插入入口,不再需要判断是调用offerFirst()还是add(0) -
removeFirst()/removeLast():原子性移除并返回,避免先 get 再 remove 的竞态风险
示例中用 LinkedHashSet 启动,天然去重+有序+零拷贝支持全部首尾方法,适合做带 LRU 行为的缓存容器。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
reversed() 是视图,不是复制,更不是流
collection.reversed() 返回的是原集合的逆序视图(view),特点是:
- 惰性求值:不创建新集合,不复制元素,内存开销为 O(1)
- 实时同步:对原集合的增删改,会立即反映在 reversed 视图中(反之亦然)
-
仍可操作:reversed 视图本身也是
SequencedCollection,支持getFirst()(即原集合的 last)、addLast()(即向原集合头部插入)等
比起 Collections.reverse(list) 的就地翻转,或 stream().sorted(Comparator.reverseOrder()) 的排序重建,reversed() 更轻量、更精准、更符合“序列方向切换”的本意。
和不可变集合、流式 API 的协同用法
SequencedCollection 不是孤立特性,它与现代 Java 编程范式深度咬合:
-
Collections.unmodifiableSequencedCollection(seq):生成不可变但依然保留首尾/反转能力的封装,比unmodifiableList语义更完整 -
seq.reversed().stream().limit(3):轻松获取“最后三个元素”,无需先转数组或手动倒序索引 - 配合
SequencedSet和SequencedMap,整套“有序抽象”形成闭环,例如LinkedHashMap.keySet()实现了SequencedSet,天然支持getFirst()获取最早插入的 key
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










