Java中list.toArray()无参重载返回Object[],强转String[]会抛ClassCastException;正确用法是list.toArray(new String[0]);Arrays.asList()返回不可变List,增删操作抛UnsupportedOperationException;原始类型数组与集合互转需手动拆箱/装箱。

Java中list.toArray()返回Object[]却强转失败
直接写(String[]) list.toArray()会抛ClassCastException,因为toArray()无参重载永远返回Object[],哪怕List里全是String。JVM不认“内容是String”这回事,只看数组实际类型。
正确做法是传入带类型的数组作为参数:
- 用
list.toArray(new String[0])——推荐,简洁且兼容所有JDK版本 - 或
list.toArray(new String[list.size()])——稍高效(避免扩容),但需确保list非null - 别用
list.toArray(new String[] {})以外的空数组变体,比如new String[1],可能触发不必要的扩容逻辑
Arrays.asList()返回的List不能增删
它返回的是Arrays$ArrayList(注意不是java.util.ArrayList),底层直接引用原数组,没有独立的elementData字段,所以add()、remove()、clear()全抛UnsupportedOperationException。
常见误用场景:把数组转成List后想过滤或去重——结果一调removeIf()就崩。
立即学习“Java免费学习笔记(深入)”;
- 真要可变操作,必须包装一层:
new ArrayList(Arrays.asList(arr)) - 如果只是遍历或查找,
Arrays.asList()完全够用,轻量无额外开销 - 注意:它对基本类型数组无效,
Arrays.asList(new int[]{1,2})只会得到含一个int[]元素的List
泛型擦除导致Arrays.asList()在方法参数中失效
写个方法void foo(List<string> list)</string>,然后传Arrays.asList("a", "b")没问题;但一旦中间经过泛型方法转发,比如<t> List<t> wrap(T... items) { return Arrays.asList(items); }</t></t>,再调foo(wrap("a","b")),编译可能通过,运行时却可能因类型推导偏差出问题——尤其当参数含null或混合类型时。
- 根本原因是
Arrays.asList()依赖传入的varargs数组类型,而泛型方法的T在擦除后常退化为Object - 最稳方案:避免在泛型桥接方法里依赖
Arrays.asList()的返回类型推断 - 必要时显式指定类型:
Arrays.<string>asList("a", "b")</string>
原始类型数组与集合互转必须手动拆箱
int[]和List<integer></integer>之间没有自动转换路径。用Arrays.asList(intArr)只会得到List<int></int>,不是你想要的。
- 转出:用Stream(JDK8+):
Arrays.stream(intArr).boxed().collect(Collectors.toList()) - 转入:用
list.stream().mapToInt(Integer::intValue).toArray() - 别碰Apache Commons Lang的
ArrayUtils.toObject()之类工具类——它们只是帮你循环装箱,没省多少事,还多一层依赖
这些转换本质都是复制数据,别指望零拷贝。原始类型数组和引用类型集合天生隔层,绕不开内存分配和遍历。









