最稳妥方式是new ArrayList(Collections.nCopies(n, value)),因Collections.nCopies()返回不可变视图,须包装为可变列表才能安全填充或修改;Arrays.asList()配合fill()可行但受限于底层数组,而直接构造更简洁高效。

Java 中用 Collections.fill() 初始化固定长度、非空的 List,关键在于:先创建有容量的列表(如 Arrays.asList() 或 new ArrayList(Collections.nCopies())),再用 fill() 填充——但要注意底层是否支持修改。
用 Collections.nCopies() + new ArrayList() 最稳妥
这是最常用也最安全的方式。因为 Collections.nCopies(n, obj) 返回的是不可变视图,不能直接 fill;必须包装成可变列表后再填充:
- 创建含 n 个
null或默认值的可变列表,再用fill()赋值 - 或直接用
Collections.nCopies(n, value)构造后转为ArrayList,此时已初始化完毕,无需 fill(更推荐)
示例(初始化 5 个 "abc"):
List<string> list = new ArrayList(Collections.nCopies(5, "abc"));</string>
这样得到的就是长度为 5、每个元素都是 "abc" 的可变列表,简洁且无副作用。
慎用 Arrays.asList() 配合 fill()
Arrays.asList(new String[5]) 生成的列表底层是数组,支持 set(),但 Collections.fill() 对它有效——不过要注意初始元素是 null,fill 后才变成目标值:
String[] arr = new String[5]; List<string> list = Arrays.asList(arr); // 注意:arr 必须提前创建 Collections.fill(list, "xyz"); // ✅ 可行,list 元素全变为 "xyz"</string>
但若写成 Arrays.asList("a", "b", "c") 这类字面量,则长度固定且不可扩容,fill 只能作用于现有元素,无法改变长度。
避免踩坑:不可变列表调 fill 会抛异常
以下写法会触发 UnsupportedOperationException:
List<string> fixed = Collections.nCopies(3, "x"); Collections.fill(fixed, "y"); // ❌ 运行时异常</string>
原因:nCopies 返回的是不可修改的集合。必须先转成 ArrayList 或其他可变实现才能安全 fill 或后续修改。
替代方案:一行流式初始化(Java 10+)
如果只是想快速获得固定长度、同值列表,不一定要用 fill():
-
List.of()创建不可变列表(适合只读场景) -
Stream.generate(() -> "val").limit(n).toList()(Java 16+) -
new ArrayList(Collections.nCopies(n, val))仍是兼顾兼容性与可变性的首选
不需要修改时,Collections.nCopies 本身已足够;需要后续 add/remove,务必套一层 ArrayList。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











