system.arraycopy仅高效搬运数据,不管理内存增长;动态数组扩容需闭环处理容量判断、新空间分配、数据搬运和引用更新。

System.arraycopy 本身不管理内存增长,它只做高效搬运——真正高效管理动态数组内存,靠的是把“判断容量→分配新空间→搬运有效数据→更新引用”这四步闭环设计好。
目标数组必须提前配足容量
arraycopy 不申请内存,也不检查目标是否够用,只按你给的地址和长度硬搬。一旦 destPos + length 超出 dest.length,立刻抛 ArrayIndexOutOfBoundsException。
- 扩容前先确保新数组已创建,且长度 ≥ destPos + length
- 别用 Arrays.copyOf 封装后再手动调整——多一次堆分配,纯属冗余
- 若需动态长度,优先用 new int[n] 预分配,而不是依赖扩容逻辑
只搬运有效元素,长度必须传 size
数组的 length 是物理容量,size 才是当前已存元素个数。搬运时若传错长度,会导致末尾填入默认值(如 null 或 0),后续 get() 可能返回意外值,逻辑被静默污染。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 追加场景:System.arraycopy(old, 0, new, 0, size) —— 复制前 size 个元素
- 插入/删除场景:按需偏移搬运,例如在 index 插入,先将 old[index..size-1] 搬到 new[index+1..size]
- 永远不要传 old.length 或 new.length,除非你明确要复制全部或填充默认值
类型匹配要严格到运行时
编译期只做引用兼容性检查,实际搬运才校验元素类型。跨基本类型(int[] → long[])或逆向协变(Object[] → String[])都会在运行时报 ArrayStoreException。
- 同类型数组(int[] → int[]、String[] → String[])性能最优,走纯位拷贝路径
- 子类数组可拷到父类数组(如 ArrayList[] → List[]),但目标数组运行时类型必须能容纳源元素
- 泛型擦除后调用(如 T[] → Object[])会引入桥接方法,破坏 JIT 内联,应避免
大小阈值影响底层执行路径
小数组反而拖慢:length ≤ 16 时,JNI 调用开销常高于简单赋值;256 是更稳妥的启用分界点。
- length 尽量用编译期常量(如 1024),JIT 更易向量化或展开为 SIMD 指令
- 若 length 来自变量(如 packet.length),建议加分支判断:小包走 for,大包走 arraycopy
- 基本类型数组(byte[]、int[])比对象数组更快——后者拷的是引用,虽快但属浅拷贝
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










