java数组拷贝问题多为运行时行为异常,需区分浅拷贝与深拷贝:基本类型拷贝后互不影响,引用类型默认浅拷贝(仅复制地址),应检查==判断是否同一实例;system.arraycopy需预分配目标数组并校验边界;arrays.copyof扩容时末尾补默认值,易产生脏数据。

Java数组拷贝出问题,通常不是语法报错,而是运行时行为不符合预期——比如改了副本,原数组也变了;扩容后多出的元素是0或null却没察觉;或者部分拷贝时下标越界、长度算错。掌握几个关键调试点,能快速定位根源。
确认是浅拷贝还是深拷贝
基本类型(int、double、boolean等)数组无论用哪种方式拷贝,都是值复制,修改副本不影响原数组。但引用类型(如String[]、自定义对象数组)默认只拷贝引用地址——这就是浅拷贝。
- 检查数组元素类型:如果是类类型,用==比较两个数组对应位置的对象是否同一实例,例如
t2[0] == t1[0]返回true,说明是浅拷贝 - 若需真正隔离,对引用类型数组不能只拷贝数组本身,还要逐个调用对象的clone()或重新new实例
- 注意:Arrays.copyOf()、clone()、System.arraycopy()对对象数组都只做浅拷贝
验证目标数组是否已正确初始化
System.arraycopy()不会自动创建新数组,必须提前分配好目标数组空间。未初始化或长度不足会直接抛异常或静默截断。
- 运行前检查
dest是否为null,长度是否≥所需拷贝长度 - 常见错误:写成
int[] dest = new int[0];却想拷贝5个元素 → 报ArrayIndexOutOfBoundsException - 建议在调用前加断点或日志:
System.out.printf("src.length=%d, dest.length=%d, length=%d%n", src.length, dest.length, len);
核对arraycopy参数顺序与边界
System.arraycopy()五个参数极易填反或计算错误,尤其srcPos和destPos容易混淆起始下标。
- 记住口诀:“源起、目起、长度”——
arraycopy(src, srcPos, dest, destPos, length) - 确保
srcPos + length ≤ src.length,且destPos + length ≤ dest.length,否则抛IndexOutOfBoundsException - 调试技巧:把参数单独提取为变量并打印,避免硬编码埋雷
留意Arrays.copyOf的扩容逻辑
Arrays.copyOf(original, newLength)看似简单,但newLength与原数组长度的关系直接影响结果内容。
- newLength
- newLength == original.length:完整复制
- newLength > original.length:前段填原数据,后段补默认值(int→0,String→null,对象→null)
- 常见疏漏:误以为扩容后所有元素都有效,实际末尾可能是“脏值”,使用前应明确判断
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











