System.arraycopy的五个参数构成精确内存搬运指令:src和dest必须非空且类型兼容,srcPos与destPos≥0且满足边界约束,length为合法元素个数,支持重叠安全复制。

System.arraycopy 的五个参数不是随意排列的占位符,而是共同构成一次精确内存搬运的完整指令:从哪来、从哪开始读、到哪去、从哪开始写、搬多少。理解每个参数的语义边界,是避免运行时异常和逻辑错位的前提。
src 和 dest:数组引用本身必须非空且类型兼容
src 和 dest 都是 Object 类型,但实际传入必须是数组对象(如 int[]、String[])。任一为 null,立即抛 NullPointerException。
- 类型兼容性由运行时检查:String[] 可复制到 Object[],但 Object[] 不能复制到 String[];int[] 和 long[] 之间不兼容,会触发 ArrayStoreException
- 泛型擦除不影响判断:List<String>[] 可安全复制到 Object[],因为擦除后仍是引用数组
- 目标数组必须已初始化且容量足够——arraycopy 不负责扩容,只做内存写入
srcPos 和 destPos:起始索引必须合法,且与 length 共同守界
这两个位置参数不是“偏移量”或“地址”,而是数组下标,必须 ≥ 0;更重要的是,它们必须与 length 联合满足边界约束:
- srcPos + length ≤ src.length(否则 ArrayIndexOutOfBoundsException)
- destPos + length ≤ dest.length(越界即失败,目标数组不会被部分修改)
- length 为 0 是完全合法的操作,常用于条件跳过或预占位,无性能损耗
length:复制元素个数,决定搬运范围而非字节数
length 是元素个数,不是字节长度。对 int[] 来说,length=5 表示复制 5 个 int(20 字节);对 String[] 来说,是复制 5 个引用(通常 8 字节/引用,64 位 JVM)。
- 负值直接抛 NegativeArraySizeException
- 它不感知数据内容,也不做深拷贝——所有元素都是浅复制,引用类型只复制指针
- 当 src 和 dest 是同一数组时,length 决定重叠区域大小,JVM 自动选择正序或逆序复制以保安全
参数组合的典型语义场景
五个参数合起来表达一种确定的内存行为,常见模式有:
- 截取子数组:src=原数组,srcPos=起始下标,dest=新数组,destPos=0,length=长度 → 如 subArray(arr, 2, 5)
- 删除后前移:src=dest=同一数组,srcPos=删除点后一位,destPos=删除点,length=剩余元素数 → ArrayList.remove() 的核心操作
- 覆盖式重置:用全零/空引用数组作为 src,复制到目标区域 → 模拟缓存行清空逻辑
- 向右平移:src=dest=同一数组,srcPos=起点,destPos=起点+偏移,length=元素数 → JVM 自动逆序复制防覆盖

















