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()的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Gradle构建Java项目指定JDK版本与编译参数实战演练

    Gradle构建Java项目指定JDK版本与编译参数实战演练

    Gradle是一种流行的构建工具,广泛用于Java、Android和其他项目,通过配置环境变量,您可以更好地控制Gradle构建过程,这篇文章主要介绍了Gradle构建Java项目指定JDK版本与编译参数的相关资料,需要的朋友可以参考下
    2026-04-04
  • java实现远程桌面的实例代码

    java实现远程桌面的实例代码

    下面小编就为大家分享一篇java实现远程桌面的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • JAVA 聚焦 OutOfMemoryError 异常问题记录

    JAVA 聚焦 OutOfMemoryError 异常问题记录

    在 Java 开发中,内存溢出异常是影响程序稳定性的关键问题,了解其原理和应对方法,对开发者至关重要,这篇文章主要介绍了JAVA聚焦 OutOfMemoryError 异常,需要的朋友可以参考下
    2025-04-04
  • Java抽象类和普通类区别、 数组跟List的区别解析

    Java抽象类和普通类区别、 数组跟List的区别解析

    这篇文章主要介绍了Java抽象类和普通类区别、 数组跟List的区别,在这里需要注意List是一个接口,不能直接实例化,需要使用具体的实现类来创建对象,本文结合示例代码介绍的非常详细,需要的朋友参考下吧
    2023-09-09
  • java WSDL接口webService实现方式

    java WSDL接口webService实现方式

    这篇文章主要为大家详细介绍了java WSDL接口webService实现方式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 详解Spring Cloud Gateway基于服务发现的默认路由规则

    详解Spring Cloud Gateway基于服务发现的默认路由规则

    这篇文章主要介绍了详解Spring Cloud Gateway基于服务发现的默认路由规则,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • SpringSecurity整合JWT的使用示例

    SpringSecurity整合JWT的使用示例

    本文主要介绍了SpringSecurity整合JWT的使用示例,整合Spring Security和JWT,可以使我们的应用程序更加安全和高效,感兴趣的可以了解一下
    2023-11-11
  • Java实现英文猜词游戏的示例代码

    Java实现英文猜词游戏的示例代码

    这篇文章主要介绍了如何用Java编写一个英文猜词游戏,可以用来背英语单词。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-02-02
  • SpringBoot带你实现一个点餐小程序

    SpringBoot带你实现一个点餐小程序

    有个小伙伴临时找到我,要开发一个点餐的系统,时间比较着急,给了2天的时间。马马虎虎的搞出来了,头发掉了一撮!下面介绍下本系统,感兴趣的小伙伴,可以参考开发下
    2022-07-07
  • 代码生成器MyBatisX:自动生成代码方式

    代码生成器MyBatisX:自动生成代码方式

    MyBatisX是一款提高开发效率的插件,可以自动生成Mapper、XML和Java实体类代码,并支持数据库表的重置和JAP提示,安装步骤简单,只需在IDEA的Plugin市场搜索并安装MyBatisX,然后打开数据库窗口选择表进行生成即可
    2024-11-11

最新评论