collections.ncopies() 是 java 中用于创建只读重复元素列表的高效工具,逻辑长度为 n 但仅存储一份元素引用和长度,内存占用极小、时间复杂度 o(1),调用修改方法会抛 unsupportedoperationexception,适用于初始化默认值、测试数据等只读场景。
collections.ncopies() 是 java 中一个轻量、高效生成“重复元素只读列表”的工具方法,特别适合需要大量相同元素但不打算修改的场景(比如初始化默认值、测试数据、占位符等)。它不真正创建包含 n 个重复对象的 arraylist,而是返回一个**逻辑上长度为 n 的只读视图**,内存占用极小,时间复杂度 o(1)。
核心用法:一行代码生成只读重复列表
语法很简单:
List例如,生成 100 万个 "default" 字符串的只读列表:
⚠️ 注意:这不是 new 出来的 ArrayList,而是一个内部优化的不可变 List 实现(`Collections$CopiesList`),底层只存一份元素引用和长度,不复制对象。
关键特性与使用前提
-
完全只读:调用
add()、remove()、set()等任何修改方法都会抛出UnsupportedOperationException -
元素是引用共享:如果元素是可变对象(如
new ArrayList()),所有位置都指向同一个实例 —— 修改其中一个,所有位置“看起来”都被改了(实际是同一对象) - 支持泛型,类型安全:编译期检查元素类型是否匹配列表声明类型
-
适用于基本需求,不支持随机写入或扩容:若需后续修改,请转成可变列表(如
new ArrayList(defaults),但会失去内存优势
常见搭配技巧
-
配合
Arrays.asList()或流构造复合结构:
List- > matrixRow = Collections.nCopies(1000, Arrays.asList(0, 0, 0));
(注意:这里每行是同一个Arrays.asList实例,如需独立副本,不能直接这么用) -
用于初始化不可变集合(配合
Set.copyOf()或List.copyOf()):
ListsafeList = List.copyOf(Collections.nCopies(10000, "N/A"));
(Java 10+,进一步确保不可变语义) -
避免误用:不要用于可变对象且需独立状态的场景
错误示例:Collections.nCopies(10, new Date()) → 10 个位置共享同一个 Date 实例,调用setTime()会影响全部
性能对比小提示
生成百万级重复元素时:
-
Collections.nCopies(1_000_000, "x"):瞬时完成,内存≈固定开销(约几十字节) - 手动循环
for (int i=0; i:耗时 + 占用 ~8MB(假设 String 引用 8 字节 × 10⁶)
所以,只要业务允许只读,nCopies 是最省时省空间的选择。










