system.arraycopy不支持跨类型数组复制,仅允许同类型或子类数组→父类数组(如string[]→object[]),基本类型与引用类型互转、基本类型间互转均被禁止,运行时类型不兼容则抛arraystoreexception。

System.arraycopy 不能实现不同类型数组之间的复制,它只支持相同类型的数组(即源数组和目标数组的组件类型必须一致),这是由 JVM 的类型安全机制决定的。
为什么不能跨类型复制
System.arraycopy 是一个 native 方法,底层直接操作内存,不经过 Java 字节码的类型检查。但它要求源数组和目标数组的元素类型在运行时完全兼容,否则会抛出 ArrayStoreException(目标数组类型不匹配)或 ArrayIndexOutOfBoundsException(索引越界),甚至在某些情况下直接导致 JVM 崩溃(如试图把 Object[] 复制到 int[])。
- int[] 只能复制到 int[]、Integer[] 也不能直接复制过去(基本类型与引用类型不兼容)
- String[] 可以复制到 Object[](因为 String 是 Object 子类),但反过来不行
- byte[] 和 char[] 看似都是数值型,但 JVM 视为完全无关类型,无法互拷
常见“伪跨类型”场景及正确做法
有些需求看似要“跨类型复制”,实际是数据转换,需手动处理:
- 基本类型数组转包装类数组:用循环或 Stream,例如 int[] → Integer[]
- 字节数组转字符数组:需指定字符编码,用 new String(bytes, charset).toCharArray()
- Object[] 中提取某种子类型:先 instanceof 过滤,再用 arraycopy 复制符合条件的元素
替代方案推荐
若真需类型转换后复制,优先使用标准库工具:
- Arrays.stream(arr).mapToInt(Integer::intValue).toArray() —— Integer[] → int[]
- ByteBuffer.wrap(bytes).asCharBuffer().array() —— byte[] → char[](需注意字节序和编码)
- Apache Commons Lang 的 ArrayUtils 提供 convertArray 系列方法,内部仍是逐元素转换
性能提醒
System.arraycopy 的优势在于 JVM 内部优化(如内存块拷贝、可能调用 memcpy),但一旦涉及类型转换,就失去该优势。此时不要强行“绕过类型检查”,而是接受转换开销,把逻辑写清楚、可维护更重要。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











