Collections.reverse()反转List需原集合可变,Arrays.asList()返回的不可变列表须先转为ArrayList;shuffle()重复因默认Random种子相同,应传入显式Random实例;unmodifiableList仅防结构修改,不防元素状态变更;emptyXXX()为单例,比new更省内存。

怎么用 Collections.reverse() 反转 List?
它只改顺序,不新建对象,所以原 List 必须是可变的(比如 ArrayList),对 Arrays.asList() 返回的“假 ArrayList”直接调用会抛 UnsupportedOperationException。
- 常见错误:反转
Arrays.asList("a", "b", "c")后修改元素,结果报错——因为底层是数组,不支持增删 - 安全做法:先包装成真正的
ArrayList:new ArrayList(Arrays.asList(...))再反转 - 注意:
Collections.reverse()对LinkedList也有效,但时间复杂度是 O(n),不是 O(1)
Collections.shuffle() 打乱顺序为什么每次结果一样?
默认用的是系统当前时间做种子的 Random,但如果在毫秒级内多次调用(比如循环里),很可能拿到同一个种子,导致打乱结果重复。
- 典型场景:单元测试中反复调用
shuffle(),发现输出总一样 - 解决办法:显式传入带随机种子的
Random实例,比如Collections.shuffle(list, new Random(42)) - 如果需要加密安全的打乱(如抽奖),别用这个,改用
SecureRandom配合自定义逻辑
用 Collections.unmodifiableList() 包装后真安全吗?
它只挡住了“直接修改集合结构”的操作(比如 add()、clear()),但不防住内容对象本身被改——如果集合里存的是可变对象(比如 ArrayList<StringBuilder>),外面拿引用照样能改内部状态。
- 错误认知:“不可变集合 = 里面所有东西都不能动”
- 真实限制:只能防止集合长度/顺序变化,不能防止元素字段被修改
- 若要深度不可变,得确保元素类型本身不可变(如用
String而非StringBuilder),或手动深拷贝 - 性能提示:这些
unmodifiableXxx()方法都只是包装一层代理,零拷贝,开销极小
为什么 Collections.emptyXXX() 比 new ArrayList() 更好?
前者返回的是单例空集合,内存里只有一份;后者每次 new 都分配新对象,哪怕内容为空,也多占堆空间、触发 GC。
立即学习“Java免费学习笔记(深入)”;
- 适用场景:方法返回值明确不会添加元素时,优先用
Collections.emptyList() - 类型擦除注意:不能写
Collections.emptyList<String>()这种带泛型调用,得靠变量声明或强制转型来保类型 - 兼容性:JDK 9+ 推荐用
List.of()替代,但List.of()不接受 null,而Collections.EMPTY_LIST允许 null 元素(虽然它本身是空的)










