system.arraycopy不分配内存,只搬运数据;它快因跳过java层循环和逐元素检查,严因参数错一个即抛异常,目标数组须预分配且长度≥destpos+length,类型不匹配或越界均运行时抛arraystoreexception或arrayindexoutofboundsexception。

System.arraycopy 不分配内存,只搬运数据——它快,是因为跳过 Java 层循环和逐元素检查;它严,是因为参数错一个就立刻抛异常,不修复、不提示、不静默。
目标数组必须提前配足容量
它不做扩容,也不检查是否够用,只按你给的地址和长度硬搬。一旦 destPos + length 超出 dest.length,马上抛 ArrayIndexOutOfBoundsException。
- 复制前务必确保:dest 数组已 new 出来,且长度 ≥ destPos + length
- 避免用 Arrays.copyOf 封装后再手动调整——多一次堆分配,纯属冗余
- 若需动态长度,优先用 new int[n] 预分配,而非依赖扩容逻辑
类型匹配要严格到运行时
编译期只做引用兼容性检查,实际搬运时才校验元素类型。跨基本类型(int[] → long[])或逆向协变(Object[] → String[])都会在运行时报 ArrayStoreException。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 同类型数组(int[] → int[]、String[] → String[])性能最优,走纯位拷贝路径
- 子类数组可拷到父类数组(如 ArrayList[] → List[]),但目标数组运行时类型必须能容纳源元素
- 泛型擦除后调用(如 T[] → Object[])会引入桥接方法,破坏 JIT 内联,应避免
大小与方向决定执行策略
小数组反而慢:length ≤ 16 时,JNI 调用开销常高于简单赋值;256 是更稳妥的启用分界点。原地复制时,JVM 自动选方向——你只需传对参数。
- 左移(destPos
- 右移(destPos > srcPos):JVM 倒序搬运,先处理高位再覆盖低位,例如 arraycopy(arr, 2, arr, 5, 5)
- length 尽量用编译期常量(如 1024),JIT 更易向量化或展开为 SIMD 指令
截取与拼接的实用写法
这不是语法糖,是两步地址搬运,每一步都得算准。拼接不是“自动合并”,而是靠 destPos 精确落位。
- 截取一段:目标数组必须提前 new 好,长度至少等于 length。例如从 byte[] src 中取 offset=100 开始的 1024 字节:System.arraycopy(src, 100, dest, 0, 1024),前提是 100 + 1024 ≤ src.length
- 拼接两个数组:先算总长,再分段落位。System.arraycopy(a, 0, result, 0, a.length);System.arraycopy(b, 0, result, a.length, b.length)——第二步的 destPos 必须是 a.length,否则覆盖或越界
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










