Java 9中List.of()的使用示例及注意事项

 更新时间:2025年03月31日 10:48:35   作者:Anpunph.  
Java 9引入了一个新的静态工厂方法List.of(),用于创建不可变的列表对象,这篇文章主要介绍了Java 9中List.of()的使用示例及注意事项的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

List.of() 是 Java 9 引入的一个静态方法,用于创建不可变的列表(ImmutableList)。这意味着一旦使用 List.of() 创建了列表,你就不能向其中添加、删除或修改元素。这个方法提供了一种方便的方式来创建包含零个或多个元素的不可变列表。

List.of() 方法有几个重载版本,允许你传递零个到十个元素作为参数。如果你需要创建包含超过十个元素的列表,你可以使用 List.of() 方法来组合较小的列表,或者使用其他集合构造方法(如 Arrays.asList() 后跟 Collections.unmodifiableList(),尽管这不是一个纯粹的不可变列表,因为它仍然可以通过原始数组进行修改)。

基本用法

// 创建一个空的不可变列表  
List<String> emptyList = List.of();  
  
// 创建一个包含单个元素的不可变列表  
List<Integer> singleElementList = List.of(1);  
  
// 创建一个包含多个元素的不可变列表  
List<String> multipleElementsList = List.of("apple", "banana", "cherry");

注意事项

  • 不可变性:一旦创建,列表的内容就不能更改。尝试添加、删除或修改元素将导致 UnsupportedOperationException

  • 性能:由于不可变性,List.of() 创建的列表在性能上可能不是最优的,特别是在进行大量修改操作时。然而,对于需要不可变集合的场景,这种方法提供了简洁性和安全性。

  • 类型安全:由于 List.of() 是一个泛型方法,它可以确保列表的类型安全。

  • 使用场景List.of() 非常适用于创建常量列表、配置列表或作为方法参数传递的不可变列表。

  • 元素限制:直接通过 List.of() 方法最多可以传递十个元素。如果需要更多元素,请考虑使用其他集合构造方法或组合多个 List.of() 调用。

示例:组合多个 List.of() 调用

// 创建两个较小的不可变列表  
List<Integer> firstHalf = List.of(1, 2, 3, 4);  
List<Integer> secondHalf = List.of(5, 6, 7, 8, 9, 10);  
  
// 使用 Stream 将它们组合成一个较大的不可变列表  
List<Integer> combinedList = Stream.concat(firstHalf.stream(), secondHalf.stream())  
    .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));  
  
// 注意:上面的 combinedList 实际上不是纯粹的 List.of() 创建的不可变列表,  
// 但它通过使用 Collections.unmodifiableList() 达到了类似的效果。  
  
// 更简洁但非纯不可变的方法(如果不需要完全的不可变性)  
List<Integer> simplerCombinedList = new ArrayList<>(firstHalf);  
simplerCombinedList.addAll(secondHalf);  
// 注意:simplerCombinedList 是可变的

上面的 simplerCombinedList 示例是可变的,而 combinedList 示例则通过 Collections.unmodifiableList() 尝试创建一个不可变列表,但它不是由 List.of() 直接创建的。对于完全由 List.of() 创建的不可变列表,你应该直接传递元素给 List.of(),或者如果元素数量超过限制,则考虑使用其他设计。

附:List.of() 和 Array.asList() 的区别

List.of()和 Array.asList()都是 Java 中用于创建列表的两种不同方法,它们都可以用来创建列表。但它们也有一些显著的区别,下面笔者将讲解下它们的主要区别

1. 不可变性和可变性

List.of()

  • 创建出来的列表是不可变的
  • 此列表一旦创建,列表中的元素就不能被修改(添加、删除或更改元素)
  • 当我们尝试修改此方法构造出来的列表时,会报错UnsupportedOperationException

Arrays.asList()

  • 创建的列表是基于原始数组的固定大小的列表(fixed-size)
  • 列表的大小是固定的,不能添加或删除元素
  • 但是,列表中的元素是可变的,可以修改元素
  • 底层数组的内容可以被间接修改,例如,如果列表包含的是可变对象(如ArrayList或自定义对象),那么这些对象的内部状态可以被更改

2. 性能对比

List.of()

  • 针对少量元素进行了优化,通常更适合创建固定且不可变的少量元素列表
  • 内部实现可能根据元素数量不同而有所不同(例如,针对单个元素、两个元素等使用专门的类)

Arrays.asList()

  • 基于现有的数组实现,因此性能开销较低,特别是在处理大量元素时
  • 但是,由于它是固定大小的,如果需要动态调整列表大小,性能可能不如ArrayList

3. 适用场景

List.of()

  • 适用于需要不可变列表的场景。例如作为常量、配置数据或任何不希望被修改的数据集合

Arrays.asList()

  • 适用于需要将现有数组转换为列表的场景,或者当你知道列表大小不会改变但需要列表功能(如迭代、索引访问)时

总结

到此这篇关于Java 9中List.of()的使用示例及注意事项的文章就介绍到这了,更多相关Java9 List.of()的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Data JPA实现持久化存储数据到数据库的示例代码

    Spring Data JPA实现持久化存储数据到数据库的示例代码

    Spring Data JPA是Spring基于JPA规范的基础上封装的⼀套 JPA 应⽤框架,可使开发者⽤极简的代码即可实现对数据库的访问和操作。本文我们来了解如何用Spring Data JPA框架实现数据持久化存储到数据库,感兴趣的可以了解一下
    2022-04-04
  • Spring boot搭建web应用集成thymeleaf模板实现登陆

    Spring boot搭建web应用集成thymeleaf模板实现登陆

    这篇文章主要介绍了Spring boot搭建web应用集成thymeleaf模板实现登陆,页面使用bootstrap,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 解读@Data注解父子类继承的问题

    解读@Data注解父子类继承的问题

    在Java开发中,使用Lombok库的@Data注解简化了代码,但在父子类继承关系中使用@Data注解时会遇到问题,主要问题是:当父类和子类都使用@Data注解时,会导致equals方法不对称,解决方案是在子类中使用@EqualsAndHashCode注解
    2024-11-11
  • SpringBoot中整合Shiro实现权限管理的示例代码

    SpringBoot中整合Shiro实现权限管理的示例代码

    这篇文章主要介绍了SpringBoot中整合Shiro实现权限管理的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • springboot脱敏控件升级支持深度脱敏

    springboot脱敏控件升级支持深度脱敏

    这篇文章主要为大家介绍了springboot脱敏控件升级支持深度脱敏,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Spring AOP实现多数据源动态切换

    Spring AOP实现多数据源动态切换

    本文主要介绍了Spring AOP实现多数据源动态切换,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 详细聊一聊JavaWeb中的Request和Response

    详细聊一聊JavaWeb中的Request和Response

    这篇文章主要给大家介绍了关于JavaWeb中Request和Response的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • Java设置PDF有序和无序列表的知识点总结

    Java设置PDF有序和无序列表的知识点总结

    在本篇文章中小编给大家整理了关于Java设置PDF有序和无序列表的知识点,需要的朋友们参考下。
    2019-03-03
  • SpringBoot配置文件、多环境配置、读取配置的4种实现方式

    SpringBoot配置文件、多环境配置、读取配置的4种实现方式

    SpringBoot支持多种配置文件位置和格式,其中application.properties和application.yml是默认加载的文件,配置文件可以根据环境通过spring.profiles.active属性进行区分,命令行参数具有最高优先级,可覆盖其他所有配置
    2024-09-09
  • springboot如何读取配置文件到静态工具类

    springboot如何读取配置文件到静态工具类

    这篇文章主要介绍了springboot实现读取配置文件到静态工具类方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论