system.arraycopy是jvm层面的内存块搬运指令,非复制函数;它不创建数组、不装箱、不校验元素值,仅严格按五个参数整块搬移,任一参数违规即抛arrayindexoutofboundsexception或arraystoreexception。

System.arraycopy 不是“复制函数”,而是 JVM 层面的内存块搬运指令。它不创建新数组、不装箱、不校验元素值,只做严格边界的整块搬移——参数错一个,立刻抛异常。
五个参数必须逐个对齐
调用格式:System.arraycopy(src, srcPos, dest, destPos, length)
- src:源数组,不能为空,否则抛 NullPointerException
- srcPos:从源数组第几个索引开始读(≥0,且 ≤ src.length)
- dest:目标数组,必须已 new 出来,不能为 null
- destPos:往目标数组第几个索引开始写(≥0)
- length:要拷贝多少个元素(≥0,且 ≤ src.length − srcPos,同时 ≤ dest.length − destPos)
任一条件不满足,运行时直接抛 ArrayIndexOutOfBoundsException 或 ArrayStoreException(类型不兼容时)。
截取数组:本质是局部拷贝
想从 byte[] 或 int[] 中取 [from, to) 区间(左闭右开),关键在算准 srcPos 和 length:
- srcPos = from
- length = to − from(必须 ≥ 0,且不能超过剩余长度)
- dest 必须提前分配好,长度至少为 length
- 例如:从 arr[5] 开始取 3 个 → arraycopy(arr, 5, dest, 0, 3)
- 若 offset + length > src.length,不等执行就崩溃,不是静默截断
拼接两个数组:分两步,destPos 是关键
拼接不是语法糖,是两次搬运。核心是第二段的目标起始位置必须等于第一段长度:
- 先算总长:int[] result = new int[a.length + b.length]
- 搬 a:arraycopy(a, 0, result, 0, a.length)
- 搬 b:arraycopy(b, 0, result, a.length, b.length) —— 这里 a.length 是 destPos,不是 0
- 常见错误:destPos 写成 0,b 覆盖 a;或 result 长度少 1,越界爆炸
原地移动:JVM 自动处理重叠
当 src == dest,就是原地移位,JVM 会根据 srcPos 和 destPos 大小关系自动选正向或倒序搬运,避免覆盖:
- 左移(destPos arraycopy(arr, 4, arr, 2, 5),JVM 正向搬
- 右移(destPos > srcPos):如 arraycopy(arr, 2, arr, 5, 5),JVM 倒序搬,先搬 arr[6] 再覆盖 arr[2]
- srcPos == destPos 且 length ≠ 0:等效空操作;length = 0 合法,可作边界预检











