博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
list复制 浅拷贝和深拷贝
阅读量:4181 次
发布时间:2019-05-26

本文共 2568 字,大约阅读时间需要 8 分钟。

浅拷贝

list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。造成的后果就是,改变B的同时也会改变A,因为改变B就是改变B所指向地址的内容,由于A也指向同一地址,所以A与B一起改变。

1.jpg

深拷贝

深拷贝就是将A复制给B的同时,给B创建新的地址,再将地址A的内容传递到地址B。ListA与ListB内容一致,但是由于所指向的地址不同,所以改变相互不受影响。

2.jpg

package com.xiaobu.note.List;import lombok.Data;import java.io.Serializable;/** * @author xiaobu * @version JDK1.8.0_171 * @date on  2020/4/22 15:51 * @description */@Datapublic class Person  implements Serializable {
private static final long serialVersionUID = 4985979692978416419L; private String name; private Integer age; public Person(){
} public Person(String name,Integer age){
this.name = name; this.age = age; }}
package com.xiaobu.note.List;import java.io.*;import java.util.ArrayList;import java.util.List;/** * @author xiaobu * @version JDK1.8.0_171 * @date on  2018/11/9 17:31 * @description V1.0 */public class Demo6 {
public static void main(String[] args) {
List list1 = new ArrayList<>(); Person person1 = new Person("1", 1); Person person2 = new Person("2", 2); list1.add(person1); list1.add(person2); List list2 = new ArrayList<>(); List list3; list2.addAll(list1); list3 = deepCopy(list1); System.out.println("修改前=========="); System.out.println("list2 = " + list2); System.out.println("list1 = " + list1); System.out.println("list3 = " + list3); person2.setAge(3); System.out.println("修改后=========="); System.out.println("list2 = " + list2); System.out.println("list1 = " + list1); System.out.println("list3 = " + list3); } /** * 功能描述:深拷贝 * @author xiaobu * @date 2020/4/22 17:17 * @param src list * @return java.util.List
* @version 1.0 */ public static
List
deepCopy(List
src) {
try {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(src); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in = new ObjectInputStream(byteIn); @SuppressWarnings("unchecked") List
dest = (List
) in.readObject(); return dest; } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } return null; }}

结果如图:

list3执行的深拷贝所以不受影响,list2执行的浅拷贝,list1和list2内存地址一致,只要有一个里面的对象属性发生变化就会随着改变。
1587547219(1).jpg

参考:

转载地址:http://rwgai.baihongyu.com/

你可能感兴趣的文章
java进程占用CPU过高
查看>>
CSDN-markdown编辑器
查看>>
拷贝整个目录到另一台服务器并排除log目录
查看>>
拜托,面试别再问我跳表了!
查看>>
android ArrayList<String> 转 String[]
查看>>
RecyclerView baseadapter
查看>>
Android中应用程序如何获得系统签名权限
查看>>
Recycler表格(excelPanel)
查看>>
android一行代码实现沉浸式布局效果
查看>>
json, recyclerView问题
查看>>
cmake处理多源文件目录的方法
查看>>
Service Intent must be explicit
查看>>
android studio SDK开发
查看>>
studio 统计代码的行数
查看>>
字符数组和16进制互换
查看>>
PHP项目中出现致命错误: Class 'Redis' not found
查看>>
There is no tracking information for the current branch.
查看>>
fatal: refusing to merge unrelated histories
查看>>
Git命令还原未提交的变更
查看>>
Linux系统中环境变量的配置
查看>>