第4篇秒懂数组拷贝感知新境界一、核心知识点数组拷贝的传统方式循环赋值及其低效问题System.arraycopy()底层性能优势JVM底层C/C实现Arrays.copyOf()便捷用法浅拷贝机制引用复制 vs 对象新建深拷贝的简单实现二、通俗讲解1分钟开心学1. 什么是数组拷贝假设你有一个装着5个球的箱子A数组你想把球全部复制到一个新箱子B另一个数组里。这就是数组拷贝。2. 新手做法循环逐个搬运for(inti0;isrc.length;i){dest[i]src[i];}没什么大问题但如果箱子巨大比如100万个球每次搬一个效率就低了。3. 高手做法直接撬动整排货架System.arraycopy()是JVM底层用C/C实现的可以直接从内存中批量复制就像用叉车一次性搬走整排货架比手工搬快得多。4. 浅拷贝是什么如果数组里放的不是基本类型如int而是对象比如Person那么拷贝的结果是新数组里的元素和原数组里的元素指向内存中的同一批对象。你通过新数组修改了对象的属性原数组对应对象的属性也会变。生活类比你有一张同学录原数组上面写着张三家的地址。你复印了一份同学录新数组两份同学录上写的是同一个地址。你通过新同学录去张三家里涂鸦原同学录上对应的张三也会被涂鸦覆盖。三、实操代码案例 场景说明场景你需要将一个数组的部分元素复制到另一个数组的指定位置例如在游戏开发中动态合并怪物列表。1. 使用System.arraycopy()// 源数组int[]src{10,20,30,40,50};// 目标数组长度比源数组大一点int[]destnewint[10];// 参数源数组源起始索引目标数组目标起始索引复制长度System.arraycopy(src,1,dest,2,3);// dest变成: [0, 0, 20, 30, 40, 0, 0, 0, 0, 0]2. 使用Arrays.copyOf()更简洁int[]src{1,2,3};int[]newArrArrays.copyOf(src,5);// 新数组长度5多余元素补0// newArr [1,2,3,0,0]3. 浅拷贝演示引用类型数组classPerson{Stringname;Person(Stringn){namen;}}Person[]original{newPerson(张三),newPerson(李四)};Person[]copyArrays.copyOf(original,original.length);copy[0].name王五;System.out.println(original[0].name);// 输出王五 —— 原数组也被改了四、避坑要点错误/误区后果正确做法使用循环逐个拷贝对象数组后以为修改副本不影响原数组意外修改了原对象理解浅拷贝需要深拷贝时手动new新对象System.arraycopy源范围超出边界IndexOutOfBoundsException确保源起始长度 ≤ 源长度目标起始长度 ≤ 目标长度认为Arrays.copyOf()能自动深拷贝同上还是浅拷贝内存地址复制不是对象复制直接int[] copy original两个引用指向同一个数组修改一个两个都变使用copyOf或arraycopy创建新数组五、面试高频考点Q1System.arraycopy()和Arrays.copyOf()有什么区别System.arraycopy()需要提前创建好目标数组可以指定起始位置Arrays.copyOf()内部自动创建新数组最终也调用了arraycopy代码更简洁但灵活性稍弱。Q2什么是浅拷贝什么情况下会出问题浅拷贝只复制对象的引用地址不复制对象本身。当通过副本修改对象内部状态时原数组也会受影响。需要深拷贝时应遍历数组并逐个new新对象或使用序列化。Q3如何实现一维对象数组的深拷贝简单方法遍历原数组对每个元素调用clone()如果对象实现了Cloneable或手动new。更通用的方法使用序列化实现Serializable后反序列化。六、练习题代码填空System.arraycopy(______, 0, ______, 0, 3);将源数组前3个元素复制到目标数组的前3个位置。简答浅拷贝在实际项目中可能导致什么bug举例说明。动手写一个工具方法public static T T[] deepCopy(T[] original)实现通用深拷贝提示利用序列化或new实例。