system.arraycopy在重叠拷贝时天然安全,因其自动根据srcpos与destpos大小关系选择正序或倒序复制:srcpos>destpos时正序,srcpos

System.arraycopy 支持数组重叠拷贝,但必须注意源和目标区域的相对位置,否则可能因覆盖导致数据错误。关键在于:当 src 和 dest 是同一个数组,且 srcPos destPos 时可从前向后复制。
什么是数组重叠拷贝
重叠拷贝指源数组和目标数组是同一个数组,且源区间与目标区间存在交集。例如把数组中前3个元素移到后面2个位置:a[0..2] → a[3..5],此时 srcPos=0,destPos=3,区间不重叠,安全;但若 a[2..4] → a[1..3],srcPos=2,destPos=1,源起始在目标之后,复制时需从前向后,否则 a[2] 被覆盖后,a[3] 就读不到原始值了。
System.arraycopy 自动处理重叠吗
是的,Java 的 System.arraycopy 内部已针对重叠做了优化:它会根据 srcPos 和 destPos 的大小关系自动选择正向或反向复制,无需用户手动判断方向。只要调用参数合法(索引不越界、长度非负),结果总是正确的。
- 当 srcPos
- 当 srcPos >= destPos:内部从开头正序复制,效率更高
- 该行为对用户透明,你只需像普通拷贝一样写代码
正确使用的典型例子
假设 int[] arr = {1, 2, 3, 4, 5},想把索引1~2的元素(2,3)复制到索引0~1位置(覆盖原1,2):
System.arraycopy(arr, 1, arr, 0, 2); // 结果:{2, 3, 3, 4, 5}这里 srcPos=1,destPos=0,满足 srcPos > destPos,正序复制安全。若反过来:把 arr[0..1] 复制到 arr[1..2]:
System.arraycopy(arr, 0, arr, 1, 2); // 结果:{1, 1, 1, 4, 5}此时 srcPos=0
常见错误和注意事项
真正出错的不是方向选错,而是参数越界或长度不合理:
- 确保 srcPos + length ≤ src.length,destPos + length ≤ dest.length
- length 不能为负数,否则抛 NegativeArraySizeException
- src 和 dest 可以是同一数组,也可以是不同数组;重叠只在同数组且区间交叉时才有意义
- 不要试图用循环+赋值替代 arraycopy 做重叠移动——容易逻辑出错,且性能差











