Mushroom Notes Mushroom Notes
🍄首页
  • JavaSE

    • 基础篇
    • 数据结构
    • IO流
    • Stream流
    • 函数式接口
    • JUC
    • 反射
    • 网络编程
    • 设计模式
  • JavaEE

    • Servlet
    • JDBC
    • 会话技术
    • 过滤器监听器
    • 三层架构
  • JDK

    • 总览
  • JVM

    • 总览
  • 常用mate
  • CSS
  • JavaScript
  • rds 数据库

    • MySQL
    • MySQL 进阶
    • MySQL 库表规范
  • nosql 数据库

    • Redis
    • Redis 进阶
    • Redis 底层
    • MongoDB
  • Spring生态

    • Spring
    • Spring MVC
    • Spring boot
    • Spring Validation
  • Spring Cloud生态

    • Spring Cloud
    • 服务治理
    • 远程调用
    • 网关路由
    • 服务保护
    • 分布式事务
    • 消息中间件
  • 数据库

    • Mybatis
    • Mybatis Plus
    • Elasticsearch
    • Redisson
  • 通信

    • Netty
📚技术
  • 方案专题
  • 算法专题
  • BUG专题
  • 安装专题
  • 网安专题
  • 面试专题
  • 常用网站
  • 后端常用
  • 前端常用
  • 分类
  • 标签
  • 归档

kinoko

一位兴趣使然的热心码农
🍄首页
  • JavaSE

    • 基础篇
    • 数据结构
    • IO流
    • Stream流
    • 函数式接口
    • JUC
    • 反射
    • 网络编程
    • 设计模式
  • JavaEE

    • Servlet
    • JDBC
    • 会话技术
    • 过滤器监听器
    • 三层架构
  • JDK

    • 总览
  • JVM

    • 总览
  • 常用mate
  • CSS
  • JavaScript
  • rds 数据库

    • MySQL
    • MySQL 进阶
    • MySQL 库表规范
  • nosql 数据库

    • Redis
    • Redis 进阶
    • Redis 底层
    • MongoDB
  • Spring生态

    • Spring
    • Spring MVC
    • Spring boot
    • Spring Validation
  • Spring Cloud生态

    • Spring Cloud
    • 服务治理
    • 远程调用
    • 网关路由
    • 服务保护
    • 分布式事务
    • 消息中间件
  • 数据库

    • Mybatis
    • Mybatis Plus
    • Elasticsearch
    • Redisson
  • 通信

    • Netty
📚技术
  • 方案专题
  • 算法专题
  • BUG专题
  • 安装专题
  • 网安专题
  • 面试专题
  • 常用网站
  • 后端常用
  • 前端常用
  • 分类
  • 标签
  • 归档
  • JavaSE

  • JavaEE

  • JDK版本特性

    • 总览
    • Java8

    • Java 17

    • Java 21

      • java 21 - switch 模式匹配
      • java 21 - 序列集合
        • 介绍
        • Sequenced collections
        • Sequenced sets
        • Sequenced maps
        • 示例
      • java 21 - 虚拟线程
      • java 21 - 记录模式
  • JVM

  • Java
  • JDK版本特性
  • Java 21
kinoko
2024-01-11
目录

java 21 - 序列集合


# 介绍

Sequenced Collections统一了与有序集合相关的操作,包括获取第一个和最后一个元素,在集合的头部和尾部插入和删除元素,以及逆序遍历集合等。
随着Sequenced Collections的引入,java集合框架结构变成了这样:
SequencedCollectionDiagram20220216.png

  • List接口现在直接继承自SequencedCollection接口
  • Deque接口现在直接继承自SequencedCollection接口
  • LinkedHashSet类实现了SequencedSet接口
  • SortedSet接口现在直接继承自SequencedSet接口
  • LinkedHashMap类实现了SequencedMap接口
  • SortedMap接口现在直接继承自SequencedMap接口。

在这之前,获取首尾元素的操作
image.png

  • 一些是不必要的繁琐,如获取List的最后一个元素
  • 有些甚至没有英雄主义是不可能的:获取LinkedHashSet的最后一个元素的唯一方法是迭代整个集合!
  • 同样,从第一个元素到最后一个元素遍历通常需用迭代器或使用普通for循环,使代码冗长不直观

现在统一为了以下api,摘自官网 (opens new window):

# Sequenced collections

为解决这些问题,引入新接口SequencedCollection表示具有定义的遇到顺序的集合。每个SequencedCollection都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。它还提供统一的API访问它的第一个和最后一个元素,并以相反的顺序处理它的元素。
SequencedCollection还提供新reversed()方法,提供一个反向排序的视图。这视图可让集合以相反顺序处理元素,使用所有常见迭代机制,如增强for循环、显式的iterator()循环、forEach()、stream()、parallelStream()和toArray()。
如以前从LinkedHashSet获取反向排序的流困难,现只需linkedHashSet.reversed().stream()。
SequencedCollection还从Deque中提升一些方法,支持在两端添加、获取和删除元素:

interface SequencedCollection<E> extends Collection<E> {
    // new method
    SequencedCollection<E> reversed();
    // methods promoted from Deque
    void addFirst(E);
    void addLast(E);
    E getFirst();
    E getLast();
    E removeFirst();
    E removeLast();
}
1
2
3
4
5
6
7
8
9
10
11

# Sequenced sets

Set接口的扩展,有序集合,不含重复元素:

interface SequencedSet<E> extends Set<E>, SequencedCollection<E> {
    SequencedSet<E> reversed();    // covariant override
}
1
2
3

SequencedSet接口提供reversed()方法,用于返回一个反转顺序的SequencedSet。对于LinkedHashSet等集合,若元素已存在于集合中,则会将其移动到适当位置。这解决LinkedHashSet无法重新定位元素痛点。

# Sequenced maps

Map接口的扩展,条目具有定义好的遍历顺序。

interface SequencedMap<K,V> extends Map<K,V> {
    // new methods
    SequencedMap<K,V> reversed();
    SequencedSet<K> sequencedKeySet();
    SequencedCollection<V> sequencedValues();
    SequencedSet<Entry<K,V>> sequencedEntrySet();
    V putFirst(K, V);
    V putLast(K, V);
    // methods promoted from NavigableMap
    Entry<K, V> firstEntry();
    Entry<K, V> lastEntry();
    Entry<K, V> pollFirstEntry();
    Entry<K, V> pollLastEntry();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • reversed()返回一个反转顺序的SequencedMap
  • sequencedKeySet()返回一个有序的键集合
  • sequencedValues()返回一个有序的值集合
  • sequencedEntrySet()返回一个有序的条目集合

SequencedMap还提供了putFirst()和putLast()方法,用于在指定位置插入键值对。对于SortedMap等映射,这些方法会抛出UnsupportedOperationException。
SequencedMap还提升了一些方法从NavigableMap接口,这些方法支持在两端获取和删除条目。

# 示例

public static void main(String[] args) {
    List<Object> list = new ArrayList<>();
    list.addFirst(1);
    list.addLast(2);
    list.getLast();
    list.getFirst();
    list.reversed().forEach(System.out::println);

    SequencedMap<Object, Object> hashMap = new LinkedHashMap<>();
    hashMap.putFirst(1, 2);
    hashMap.putLast(3, 4);
    hashMap.reversed().forEach((k, v) -> System.out.println(k + ":" + v));

    SequencedSet<Object> set = new LinkedHashSet<>();
    set.addFirst(1);
    set.addLast(2);
    set.getLast();
    set.getFirst();
    set.reversed().forEach(System.out::println);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

打印

2
1
3:4
1:2
2
1
1
2
3
4
5
6

总结:java21 在没有在增加实现类的情况下对api做了增强,只要是带有序的集合类都有了这个特性

#java#jdk21
上次更新: 2024/01/11 17:06:16
java 21 - switch 模式匹配
java 21 - 虚拟线程

← java 21 - switch 模式匹配 java 21 - 虚拟线程→

最近更新
01
JVM 底层
09-13
02
JVM 理论
09-13
03
JVM 应用
09-13
更多文章>
Theme by Vdoing | Copyright © 2022-2024 kinoko | MIT License | 粤ICP备2024165634号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式