1、介绍
Collections.
nCopies是 Java 中java.util.Collections类提供的一个静态方法,用于创建一个包含指定数量的、由相同对象引用组成的不可变列表。
1.1 定义:
public static <T> List<T> nCopies(int n, T o)
- n:表示要创建的列表中元素的数量,必须为非负整数。
- o:列表中每个元素要存储的对象引用。
1.2 功能作用:
- 该方法主要用于快速创建一个具有固定大小且所有元素都相同的列表。这种列表是不可变的,意味着一旦创建,就不能添加、删除元素或修改元素的值。如果尝试对其进行修改操作,会抛出UnsupportedOperationException异常。
示例代码:
import java.util.Collections;
import java.util.List;
public class NCopiesExample {
public static void main(String[] args) {
// 创建一个包含5个 "Hello" 的不可变列表
List<String> list = Collections.nCopies(5, "Hello");
System.out.println(list);
// 尝试修改列表中的元素,会抛出异常
// list.set(0, "World");
// 尝试添加元素,会抛出异常
// list.add("Java");
}
}
2、应用场景
- 初始化固定值列表:例如在某些配置场景中,需要初始化一个具有固定数量且值相同的列表来表示某种默认配置。
- 作为不可变数据的快速构建方式:当需要一个不可变的、元素值相同的列表作为方法参数或在其他需要不可变数据结构的场景中,可以使用nCopies方法快速构建。
- 占位数据:在一些数据处理的初期,可能需要创建一个具有特定大小的列表来作为占位,后续再逐步填充或处理数据。
3、实现原理
Collections.nCopies方法的底层实现相对简洁,主要是通过创建一个实现了List
接口的内部类的实例来实现的。以 Jdk8 的源代码为例,其底层实现原理如下:
3.1 方法定义
在 Java.util.Collections类中,nCopies方法的定义如下:
public static <T> List<T> nCopies(int n, T o) {
if (n < 0)
throw new IllegalArgumentException("List length = " + n);
return new CopiesList<>(n, o);
}
该方法接收两个参数,n
表示要创建的列表中元素的数量,o
表示列表中每个元素要存储的对象引用。方法内部直接创建了一个NcopiesList类型的对象并返回。
3.2 不可变特性的实现
NcopiesList内部类
NcopiesList是Collections类中的一个私有静态内部类
private static class CopiesList<E>
extends AbstractList<E>
implements RandomAccess, Serializable
以add为例,NcopiesList内部类 继承了AbstractList,但没有去重写 AbstractList 的add方法,AbstractList里的add方法定义如下
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
当调用add方法时,就会抛出异常 UnsupportedOperationException