Java 中的不可变列表2024年9月10日 | 阅读 9 分钟 在 Java 中,不可变列表(Immutable List)是指一旦创建就无法修改的列表。尝试在创建后添加、删除或修改列表中的元素都会抛出异常。 使用不可变列表的主要好处在于它们提供了线程安全性,并使代码更加健壮。由于列表在创建后无法修改,因此不存在多个线程同时尝试修改它而导致问题的风险。此外,不可变列表可以轻松地在程序的各个部分共享,而无需担心被意外修改。 总的来说,在 Java 中使用不可变列表可以提高程序的安全性和健壮性,尤其是在共享数据结构可能导致问题的多线程环境中。 类声明在 Java 中,ImmutableList 类是 Guava 库的一部分,该库提供了多种不可变集合类。要使用 ImmutableList,我们首先需要导入包含 ImmutableList 类的 com.google.common.collect 包。 ImmutableList 类的声明如下: ImmutableList 继承自 ImmutableCollection 类,并实现了 List 接口。它是一个泛型类,这意味着我们可以创建任何数据类型的 ImmutableList。声明中的 E 代表类型参数,我们可以将其替换为任何类或接口名称。 类层次结构ImmutableList 类实现了 List 接口,并表示一个创建后无法修改的列表。 ImmutableList 的类层次结构如下: 在这里,ImmutableCollection 是一个抽象类,它提供了 ImmutableCollection 接口的骨架实现,ImmutableList 继承自该接口。 总而言之,ImmutableList 类提供了一种方便高效的方式来创建和使用 Java 中的不可变列表。 创建 ImmutableList在 Java 中,创建 ImmutableList 有多种方法,具体取决于您使用的 Java 版本和可用的库。以下是一些示例: 1. 使用 Java 9 的 of() 方法Java 9 在 List 接口中引入了一个名为 of() 的新方法,该方法可以更简洁、更易读地创建不可变列表。of() 方法是一个工厂方法,它接受可变数量的参数,并返回一个包含这些元素的不可变列表。它可以与任何实现 List 接口的类一起使用,包括 ArrayList、LinkedList 和 ImmutableList。使用 of() 方法的一个优点是它更加简洁,并通过对参数执行类型推断来提供编译时安全性,确保只将正确类型的对象添加到 List 中。总而言之,of() 方法简化了 Java 中不可变列表的创建。 查找解决方案的步骤如下所示:
文件名: ImmutableListExample.java 输出 Fruits: [apple, banana, orange, grape] Cannot modify immutable List. 2. 使用 Guava 库中的 ImmutableList.Builder 类以流畅的风格向 List 添加元素,方便逐步创建列表。 无论使用哪种方法,都可以像访问其他列表一样访问和迭代生成的 ImmutableList,但其内容无法修改。 以下是给定代码的逐步解决方案:
实施 文件名: ImmutableListExample.java 输出 Immutable List 1: [Welcome, to, home] Immutable List 2: [Welcome, to, home, Think] Immutable List 3: [Welcome, to, home, Think, Big] 3. 通过使用 ImmutableList 类的 of() 方法Guava 库中的 ImmutableList 类的 of() 方法允许您创建一个具有固定元素数量的不可变列表。一旦列表创建完成,您就无法添加、删除或修改其元素。 文件名: ImmutableListExample.java 输出 Fruits: [apple, banana, orange, grape] 4. 通过使用 copyOf() 方法在 Java 中,copyOf() 方法会创建一个新数组,该数组会复制一个现有数组并指定新数组的长度。该方法接受两个参数:要复制的数组和新数组的长度。 文件名: ImmutableListExample.java 输出 Immutable List 1: [Java, Python, C++] Immutable List 2: [Learning, Web, Development, is, Fun] 5. UnsupportedOperationException该程序演示了如何使用 Collections.unmodifiableList 方法在 Java 中创建不可变列表。此外,它还展示了如何处理尝试修改列表时抛出的 UnsupportedOperationException。 查找解决方案的步骤如下所示:
请注意,Collections.unmodifiableList 方法仅创建原始列表的不可修改视图。如果原始列表被修改,不可修改视图将反映这些更改。要创建一个真正不可修改且无法通过任何方式修改的列表,您可以使用 List 接口的自定义实现,该实现会在尝试修改列表时抛出异常。 实施 文件名: ImmutableListExample.java 输出 UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null 6. Collections.unmodifiableList()Collections.unmodifiableList() 是 Java 集合框架中的一个方法,它创建现有列表的不可修改视图。可以推断,尝试修改不可修改的列表将导致发生 UnsupportedOperationException。原始列表仍然可以被修改,并且任何更改都将反映在不可修改的列表中。 该程序展示了如何使用 Collections.unmodifiableList() 方法生成可变列表的不可修改表示。 查找解决方案的步骤如下所示:
文件名: UnmodifiableListExample.java 输出 Attempt to modify unmodifiableList failed: null mutableList: [apple, banana, orange, pear] unmodifiableList: [apple, banana, orange, pear] ImmutableList 的优点ImmutableList 具有多种优点,包括:
下一主题Java 中的方法嵌套 |
使用一种称为“忙等待”的多线程方法,一个线程在不放弃 CPU 控制的情况下一直等待某个条件满足。由于线程在等待时会积极使用 CPU 周期,因此这种策略可能导致 CPU 利用率低下。Java 中的一个线程可能会遇到...
阅读 4 分钟
在 Java 中,继承使一个类能够继承另一个类(称为父类或超类)的行为和功能。子类(通常称为子类)是接收父类这些特性的类。它表示子类……
阅读 4 分钟
在本节中,我们将了解什么是辉煌数,并创建 Java 程序来检查给定的数字是否是辉煌数。辉煌数程序经常在 Java 编码面试和学术中出现。辉煌数 一个数被称为辉煌...
阅读 13 分钟
? 通过使用字符串字面量。示例:文件:StringPerformance.java public class StringPerformance { public static void main(String[] args) { long startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String str1 = "India"; String str2= "India"; } long endTime = System.currentTimeMillis(); System.out.println("创建字面量 String 所花费的时间:" + (endTime - startTime)...
阅读1分钟
在本节中,我们将讨论如何在 Java 中反转链表。反转链表是面试中最常问到的主题之一。任务是反转一个链表,给定头节点或第一个节点...
阅读 10 分钟
在不断发展的编程语言格局中,Java 通过拥抱现代编程范式并保留其核心原则,始终保持着相关性。其中一项演变是 Java 10 中引入的 var 关键字。这项创新功能在开发者中引发了兴奋和辩论...
阅读 3 分钟
Java 通常使用 JLabel 或 System.out.println() 等 GUI 元素来捕获和跟踪打印的输出,以确定屏幕上显示的字符串序列。这可以通过将 System.out 重定向到 ByteArrayOutputStream 来动态存储打印字符串的序列来实现,或者...
5 分钟阅读
在 Java 中,延迟初始化是一种对象仅在首次需要时才创建的技术。利用这种方法可能对创建成本高昂或可能完全不需要的对象有利。但是,延迟初始化可能会导致问题...
阅读 4 分钟
在数据库领域,视图是强大的工具,它们提供了一种简化和有组织的方法来访问和操作数据库中包含的数据。视图允许开发人员构建,为用户提供数据的自定义视图,而无需更改底层数据结构...
5 分钟阅读
有向图中的循环检测是图论中的一个核心问题,在依赖解析、调度以及某些游戏算法的某些方面中经常使用。循环实际上是一个闭合路径,它是一个从...开始的路径。
阅读 10 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India