Java ArrayList<String[]>转String数组报ArrayStoreException及字符串打印问题
报错的核心原因
- 你定义的
test集合完整类型是ArrayList<String[]>,也就是说集合里存的每一个元素,都是装着字符串的数组本身,不是单个的字符串。 - 你调用
test.toArray(new String[test.size()])时,传入的目标数组是一维字符串数组,相当于要求这个ArrayList把自己存的所有“字符串数组”,挨个塞到一个装纯字符串的一维数组里。 toArray(T[] a)方法的运行逻辑是:按照你传入的目标数组的元素类型,把集合里的元素逐个做类型转换后拷贝进去。当JVM执行拷贝,尝试把取出来的String[]数组对象强制转成单个String值塞进目标位置时,因为两个类型完全不兼容,直接抛出ArrayStoreException。
为什么编译阶段没报错
Java泛型存在编译期擦除机制,运行时的ArrayList本质就是个存储Object的普通集合。toArray(T[] a)方法在编译期只会做基础的类型上界校验,不会强制要求你传入的目标数组元素类型和集合存储的元素类型完全匹配——直到运行时真正逐元素拷贝、做强制类型转换的时候,才会暴露类型不兼容的问题。
匹配你设计需求的正确写法
按照你的规划,你需要把集合内存储的所有String[]数组引用,复制到一个同类型的数组中,方便后续随机访问、同步从原集合移除元素,这时候传入toArray的目标数组类型必须和集合的泛型对应,也就是二维字符串数组:
// 目标数组元素类型为String[],和ArrayList<String[]>的泛型完全匹配 String[][] temp = test.toArray(new String[test.size()]);
小提示:拿到上述
temp二维数组后,要取具体字符串需要先通过下标拿到对应的String[]子数组,再通过二级下标读取子数组里的内容,不要直接把temp当一维字符串数组操作。
内容的提问来源于stack exchange,提问作者Agricolo
相关产品推荐
相关产品推荐

