System.arraycopy边界测试核心是验证临界索引、长度与重叠场景下的行为:索引为0或等于length时length=0合法,负值或超上限抛ArrayIndexOutOfBoundsException;length=0总安全,满载需严格满足索引+长度≤数组长;重叠拷贝由JVM自动选择正/倒序避免覆盖;类型不匹配抛ArrayStoreException。

数组拷贝操作的边界测试,核心是验证拷贝方法在临界索引、长度和容量条件下的行为是否符合预期——既不越界崩溃,也不遗漏或错位数据。
源/目标索引为0或等于数组长度的情况
这是最常见也最容易出错的边界。索引为0表示从头开始;索引等于数组长度(即 arr.length)是合法的“末尾位置”,但仅允许 length = 0 的复制(空拷贝)。若 sourceIndex 或 destIndex 超出 [0, arr.length] 范围,应抛出 ArrayIndexOutOfBoundsException。
- ✅ 合法:
System.arraycopy(src, 0, dst, 0, 0)→ 空操作,成功 - ✅ 合法:
System.arraycopy(src, src.length, dst, 0, 0)→ 源起始位置在末尾,长度为0,成功 - ❌ 非法:
System.arraycopy(src, -1, dst, 0, 1)→ 负索引,抛异常 - ❌ 非法:
System.arraycopy(src, src.length + 1, dst, 0, 1)→ 超出上限,抛异常
拷贝长度为0或刚好填满剩余空间length 参数必须满足:sourceIndex + length ≤ sourceArray.length 且 destIndex + length ≤ destArray.length。
- ✅ 合法:
length = 0→ 总是安全,无论索引如何(只要索引本身合法) - ✅ 合法:
length = src.length - srcPos→ 拷贝到源末尾 - ❌ 非法:
length = src.length - srcPos + 1→ 溢出1位,触发越界异常
源与目标数组重叠时的边界行为
重叠拷贝(如 arraycopy(arr, 1, arr, 0, 3))考验底层是否使用类似 memmove 的安全移动逻辑。关键边界包括:
- 前向重叠(目标起始在源起始之后):如
srcPos=2,destPos=0,length=3→ 拷贝arr[2],arr[3],arr[4]到arr[0],arr[1],arr[2],应保留原arr[2]值(未被提前覆盖) - 后向重叠(目标起始在源起始之前):如
srcPos=0,destPos=2,length=3→ 应正确复制arr[0→2]到arr[2→4],不因覆盖导致读取脏值
类型与维度匹配的边界校验
- ❌
System.arraycopy(new int[5], 0, new double[5], 0, 5)→ArrayStoreException,类型不兼容 - ❌ 对一维数组调用多维拷贝逻辑(如误传二维数组引用)→ 运行时类型检查失败
- ✅
Array.Copy在 .NET 中会做类型兼容性检查,int[]→long[]不允许,但int[]→object[](装箱)需显式转换,否则报错
这些案例不是为了穷举所有组合,而是抓住真正容易引发线上故障的几个关键断点:索引零值、长度零值、临界满载、重叠偏移、类型擦除陷阱。写单元测试时,每类至少覆盖一个正例+一个负例,就能守住大部分生产风险。

















