arrays.aslist()不能直接用于基本类型数组转list,因int[]被当作单个对象;应改用包装类型数组或stream.boxed();集合转数组须传泛型数组如new string[0];慎用collections.unmodifiablexxx,优先final+注释;推荐guava的lists.newarraylist()等安全工厂方法。

Arrays.asList() 不能直接用于基本类型数组转 List
这是最常踩的坑:用 Arrays.asList(new int[]{1, 2, 3}) 得到的不是 List<integer></integer>,而是一个只含单个元素(即那个 int[] 数组对象)的 List<int></int>。因为 Arrays.asList() 的泛型参数是 T...,而 int[] 是一个引用类型,编译器把它当成了一个整体参数。
正确做法是改用包装类型数组,或借助 Stream:
Integer[] arr = {1, 2, 3};
List<integer> list = Arrays.asList(arr); // ✅ 可行,但注意返回的是固定大小列表
// 或者用 Stream(推荐,更安全、可变):
List<integer> list2 = Arrays.stream(new int[]{1, 2, 3})
.boxed()
.collect(Collectors.toList());</integer></integer>
- 阿里规约明确禁止对
Arrays.asList()返回结果调用add()、remove()等结构性修改方法,它底层是Arrays$ArrayList,不支持扩容 - 如果后续要增删,必须包装成
new ArrayList(...) - 基本类型数组务必先用
Stream+boxed(),别图省事强转
集合转数组时别用 new Object[size] 做泛型擦除兜底
写 list.toArray(new Object[list.size()]) 看似能编译通过,但返回的是 Object[],丢失泛型信息,违反规约中「禁止使用原始类型数组接收泛型集合转换结果」的要求。
正确方式是传入带泛型信息的数组引用:
List<string> list = Arrays.asList("a", "b");
String[] arr = list.toArray(new String[0]); // ✅ 推荐:传入空数组,由 JVM 自动推导类型
// 或显式指定大小(但需注意:若 size 不足,toArray 会新建数组)
String[] arr2 = list.toArray(new String[list.size()]);</string>
- 传
new String[0]比new String[list.size()]更优:避免因并发修改导致 size 失准;JVM 对空数组优化好,性能无差别 - 绝对不要写
list.toArray(new Object[0]),哪怕你 cast 成String[],运行时可能抛ClassCastException - 该限制同样适用于
Set、Deque等所有Collection子类
用 Collections.unmodifiableXXX 包装前先确认是否真需要不可变语义
阿里规约鼓励「防御性编程」,但滥用 Collections.unmodifiableList() 会导致隐藏的 UnsupportedOperationException,尤其在框架回调或三方库内部修改时难以排查。
判断依据很实际:
- 如果你只是把集合传给下游方法且不关心它是否被修改,优先用
final修饰变量 + 清晰注释,而非强制不可变 - 只有当该集合会被多个模块共享、且你明确要求「任何路径都不能修改」时,才用
unmodifiable包装 - 注意:它只提供运行时保护,不阻止上游代码重新赋值变量;真正防篡改得配合
final+ 封装
示例场景:对外提供配置项列表,应返回不可变副本;但方法内临时组装的中间集合,没必要包装。
Guava 的 Lists.newArrayList() 和 Sets.newHashSet() 是安全快捷替代方案
原生 Arrays.asList() 和 new ArrayList() 组合容易出错,而 Guava 提供了语义清晰、类型安全的工厂方法,符合阿里规约「优先使用工具类封装复杂逻辑」原则。
// 替代 Arrays.asList(x, y, z) —— 支持 varargs 且返回可变 List
List<string> list = Lists.newArrayList("a", "b", "c");
// 替代 new HashSet(collection) —— 内部自动处理 null 安全和容量预估
Set<integer> set = Sets.newHashSet(1, 2, 3);
// 还有针对基本类型的专用工具:Ints.asList(), Chars.toArray() 等</integer></string>
- 这些方法返回的集合默认可变,无需额外包装,也规避了
Arrays.asList()的陷阱 - 需引入
com.google.guava:guava,但阿里内部项目普遍已集成,外部项目建议统一使用(避免混用 JDK / Apache Commons / 自定义工具类) - 注意:Guava 的
ImmutableList.of()才是真正不可变,和Lists.newArrayList()语义不同,别混淆
真正麻烦的不是语法怎么写,而是想清楚这个集合生命周期里谁读、谁写、谁负责销毁——规约里的每条“禁止”,背后都是线上 ConcurrentModificationException 或内存泄漏的血泪教训。










