collections.fill()仅填充已有元素,不扩容;reverse()要求list可修改;创建全同值集合应优先用singletonlist()或ncopies();reverse()与sort()顺序影响结果。

用 Collections.fill() 填充集合前,先确认它只改已有元素
这个方法不会扩容,也不会新建元素——它只是把集合里已有的每个位置都设成指定值。如果集合是空的,调用后还是空的;如果用它填 ArrayList,但没提前 add() 或 ensureCapacity(),那什么都不会发生。
- 适用场景:初始化一个已知大小的列表(比如先
new ArrayList(10),再fill()) - 常见错误:对刚
new ArrayList()的空列表直接fill(),结果毫无变化 - 注意类型:泛型类型必须和填充值兼容,否则编译报错,比如往
List<string></string>里fill(123)过不去
Collections.reverse() 反转时,别对不可变集合或数组调用
它只接受 List,而且要求该 List 支持 set() 操作。像 Collections.unmodifiableList() 包装过的、或者 Arrays.asList() 返回的固定大小列表(底层是数组),反转会抛 UnsupportedOperationException。
- 安全做法:先检查是否可修改,或用
new ArrayList(originalList)包一层再反转 - 性能影响:原地反转,O(n) 时间、O(1) 额外空间,比新建列表再倒序快
- 陷阱示例:
Collections.reverse(Arrays.asList(1,2,3))看似合理,实际运行时报错
填充默认值别只盯 fill(),singletonList() 和 nCopies() 更轻量
如果目标是“创建一个全是相同值的集合”,Collections.fill() 是错的路径——它不创建集合,只填充。真正该用的是 Collections.singletonList()(单元素不可变)或 Collections.nCopies(n, value)(n 个相同值的不可变列表)。
-
nCopies(5, "a")返回的是懒加载视图,内存占用小,但不可修改 - 需要可变副本?得显式转:
new ArrayList(Collections.nCopies(5, "a")) - 误用
fill()创建新集合,容易写出冗余代码,比如先 new 再 add 循环再 fill,纯属绕路
反转后还要排序?小心 reverse() 和 sort() 的顺序依赖
这两个操作不是幂等的,顺序错了结果就错。比如先 sort() 升序,再 reverse() 才得降序;反过来先 reverse() 再 sort(),又变回升序了。
立即学习“Java免费学习笔记(深入)”;
- 常见混淆:以为
reverse(sort(list))和sort(reverse(list))等价,其实后者完全没意义 - 更稳写法:用
Collections.sort(list, Collections.reverseOrder())一步到位 - 注意
reverseOrder()要求元素实现Comparable,否则运行时报ClassCastException










