system.arraycopy仅支持同种基本类型数组(如int[]→int[])和协变引用类型数组(如string[]→object[])的直接复制,不支持跨类型转换或复杂对象传输。

System.arraycopy 不能直接处理“复杂数据类型”的跨类型传输,它只做内存块搬运,不转换类型、不构造对象。所谓“高效传输”,前提是源与目标数组组件类型兼容——对 String[] 可拷到 Object[],但 int[] 拷不到 Integer[],byte[] 也进不了 ByteBuffer。真正的复杂类型(如嵌套对象、泛型集合、自定义 POJO 数组)需先解构为基本类型或引用数组,再分层调用 arraycopy。
哪些类型能用 arraycopy 直接传?
能传的只有两类:
- 同种基本类型数组:int[] → int[]、double[] → double[]、byte[] → byte[] —— 最快,JVM 可启用 SIMD 指令
- :String[] → Object[]、List
[] → Object[]、MyBean[] → Serializable[] —— 运行时逐元素校验类型,安全但略慢于基本类型
哪些看似合理实则报错?
这些写法编译可能通过,但运行必抛异常:
- int[] → Integer[]:基本类型数组和包装类数组完全不兼容,ArrayStoreException
- Object[] → String[]:父类数组不能当子类数组用,哪怕所有元素实际都是 String
- byte[] → char[]:不同基本类型间无隐式转换,不满足 component type 兼容性
- ArrayList
[] → Object[]:合法(因 ArrayList 是 Object 子类),但若数组中混入 HashMap,运行时遇到该元素仍会 ArrayStoreException
如何传输泛型/嵌套结构?分三步走
例如要把 List
- 第一步:拆成可拷贝层——外层数组是引用类型,可直接拷:System.arraycopy(srcListArr, 0, destListArr, 0, length)
- 第二步:确认内层是否需深操作——若只要复制引用(即共享 Map 实例),到此结束;若需独立副本,必须遍历调用 clone() 或序列化,arraycopy 不介入
- 第三步:规避泛型擦除陷阱——不要用 Arrays.asList(...).toArray() 中转,那会生成 Object[],丢失原始组件类型信息,导致后续 arraycopy 类型校验失败
实战建议:别让 arraycopy 做它不该做的事
它不是万能转换器,而是精准搬运工:
- 要跨类型(如 int[] → ByteBuffer),用 ByteBuffer.wrap(byte[]) + IntBuffer.asIntBuffer(),或 Unsafe.copyMemory(需权限)
- 要深拷贝对象树,用 Kryo、FST 或 JDK 序列化,而非层层 arraycopy
- 要动态截取+拼接(如从多个 packet 提取 header 合并),先用 arraycopy 搬到预分配 buffer,再用 ByteBuffer.slice() 封装视图,不复制内存
- 小数据量(≤64 元素)优先用 for 循环或 Arrays.copyOf,避免 JNI 调用开销反拖慢
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











