发布于2026-07-04 阅读(0)
扫一扫,手机访问
要理解一维数组深拷贝和浅拷贝的区别,关键在于弄清楚一点:到底有没有复制数组里每个元素指向的对象。基本类型数组和引用类型数组在这个问题上表现截然不同——前者浅拷贝就是安全的,后者浅拷贝只是换了个数组壳子,里面装的还是同一套对象。

像 int[]、double[]、boolean[] 这类数组,里面存的就是实实在在的数值(要么在栈上,要么在堆里连续存储原始值)。这种情况下,任何标准的拷贝方式——Arrays.copyOf()、System.arraycopy()、arr.clone()——都等价于深拷贝,新旧数组在内存中完全隔离。
Arrays.copyOf(arr, arr.length) 就行,语义清晰、类型安全int[] b = a;,那只是复制了个引用,不是拷贝数组本身到了 String[]、User[]、Object[] 这类数组,里面存的是对象引用(说白了就是地址)。浅拷贝只把这些地址复制一遍,地址指向的实际对象一个都没动。结果是:两个数组长度一样、元素数量一样,但第 i 个位置的引用指向的是同一个堆里的对象。
User[] users1 = {new User("张三", 25)};User[] users2 = users1.clone();users1[0] == users2[0] 结果是 trueusers2[0].setName("李四"),再取 users1[0].getName() 也会变成 "李四"没有一键就能搞定的通用方法。核心思路很简单:先创建一个新数组,然后对每个元素单独调用它的拷贝逻辑(克隆、构造器、工厂方法等),确保每个元素都是独立的新实例。
Cloneable 并重写了 clone():User[] deepCopy = Arrays.stream(src).map(u -> (User) u.clone()).toArray(User[]::new);User[] deepCopy = Arrays.stream(src).map(u -> new User(u.getName(), u.getAge())).toArray(User[]::new);SerializationUtils.clone())尽量别用:它要求所有字段都能序列化,遇到线程、文件句柄这类资源时直接失败,性能还差关键不在于“数组类型是啥”,而在于“数组里的东西会不会被修改”:
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8