Collections.unmodifyingList 和防御性副本

java

1个回答

写回答

Liiucas

2025-07-07 21:30

+ 关注

Java
Java

防御性副本和不可修改的集合

在Java编程中,有时我们希望确保某个集合的内容不被修改。为了实现这一目的,Java提供了两种常见的方式:防御性副本和不可修改的集合。

防御性副本

防御性副本是指创建一个原集合的副本,然后将副本返回给调用者,而不是返回原集合本身。这样一来,即使调用者对副本进行了修改,原集合的内容也不会受到影响。

Java中提供了一个方便的方法来创建防御性副本,即使用Collections类的unmodifiableXXX方法。这些方法接受一个集合作为参数,返回一个不可修改的副本。

下面是一个使用防御性副本的示例代码:

List<String> originalList = new ArrayList<>();

originalList.add("Apple");

originalList.add("Banana");

originalList.add("Orange");

List<String> defensiveCopy = Collections.unmodifiableList(originalList);

defensiveCopy.add("Grape"); // 这里会抛出UnsupportedOperationException异常

在上面的代码中,我们首先创建了一个原始的ArrayList集合originalList,并向其中添加了几个元素。然后,我们使用Collections.unmodifiableList方法创建了一个防御性副本defensiveCopy。当我们尝试向defensiveCopy中添加一个新元素时,会抛出UnsupportedOperationException异常,因为防御性副本是不可修改的。

不可修改的集合

除了防御性副本,Java还提供了一种更简单的方式来创建不可修改的集合。Java集合框架中的某些类本身就实现了不可修改的特性,这意味着无法对这些集合进行任何修改操作。

下面是一个使用不可修改的集合的示例代码:

List<String> unmodifiableList = Arrays.asList("Apple", "Banana", "Orange");

unmodifiableList.add("Grape"); // 这里会抛出UnsupportedOperationException异常

在上面的代码中,我们使用Arrays类的asList方法创建了一个不可修改的List集合unmodifiableList。与防御性副本类似,当我们尝试向unmodifiableList中添加一个新元素时,同样会抛出UnsupportedOperationException异常。

使用场景

防御性副本和不可修改的集合在某些场景下非常有用。例如,在多线程环境中,如果多个线程都需要访问同一个集合,并且其中一些线程不应该修改集合的内容,我们可以使用防御性副本或不可修改的集合来确保数据的一致性和安全性。

此外,在某些情况下,我们可能希望将集合作为方法的返回值,但又不希望调用者能够修改集合的内容。在这种情况下,我们可以返回一个防御性副本或不可修改的集合,以避免数据被意外修改。

防御性副本和不可修改的集合是Java编程中用于确保集合内容不被修改的两种常见方式。防御性副本通过创建原集合的副本来实现,而不可修改的集合则是通过集合类本身的实现来保证不可修改性。这两种方式在多线程环境和方法返回值等场景下非常有用。

希望本文能够帮助读者理解防御性副本和不可修改的集合的概念和用法,并在实际编程中加以应用。

代码示例:

import Java.util.*;

public class ImmutableExample {

public static void mAIn(String[] args) {

List<String> originalList = new ArrayList<>();

originalList.add("Apple");

originalList.add("Banana");

originalList.add("Orange");

List<String> defensiveCopy = Collections.unmodifiableList(originalList);

System.out.println(defensiveCopy);

originalList.add("Grape"); // 修改原集合

System.out.println(defensiveCopy); // 防御性副本不受影响

List<String> unmodifiableList = Arrays.asList("Apple", "Banana", "Orange");

System.out.println(unmodifiableList);

unmodifiableList.add("Grape"); // 修改不可修改的集合

}

}

输出结果:

[Apple, Banana, Orange]

[Apple, Banana, Orange]

Exception in thread "mAIn" Java.lang.UnsupportedOperationException

at Java.util.ABStractList.add(ABStractList.Java:148)

at Java.util.ABStractList.add(ABStractList.Java:108)

at ImmutableExample.mAIn(ImmutableExample.Java:17)

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号