欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

java深度copy和淺度copy

張吉惟1年前8瀏覽0評論

Java中的對象賦值分為淺度copy和深度copy。當我們對一個對象進行賦值操作時,如果采用的是淺度copy,那么新的對象只是指向了原對象的地址,如果修改新對象的屬性,那么原對象的屬性也會隨之改變。而深度copy則會在堆內(nèi)存中重新分配一段空間,將原對象的屬性值拷貝到新的內(nèi)存空間中,因此修改新對象的屬性不會影響原對象的屬性。

下面是一個簡單的例子,用來演示淺度copy和深度copy的區(qū)別:

public class Student {
private String name;
private Listcourses;
//構造函數(shù)、getter和setter方法省略
}
public class Course {
private String name;
//構造函數(shù)、getter和setter方法省略
}
public static void main(String[] args) {
Listcourses = new ArrayList<>();
courses.add(new Course("Math"));
courses.add(new Course("English"));
Student stu1 = new Student("Tom", courses);
//淺度copy
Student stu2 = stu1;
stu2.setName("Jack");
stu2.getCourses().get(0).setName("Chinese");
System.out.println(stu1.toString()); //輸出 "Student{name='Jack', courses=[Course{name='Chinese'}, Course{name='English'}]}"
//深度copy
Student stu3 = null;
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(stu1);
oos.flush();
oos.close();
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
stu3 = (Student) ois.readObject();
ois.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
stu3.setName("Mike");
stu3.getCourses().get(1).setName("Physics");
System.out.println(stu1.toString()); //輸出 "Student{name='Tom', courses=[Course{name='Math'}, Course{name='English'}]}"
System.out.println(stu3.toString()); //輸出 "Student{name='Mike', courses=[Course{name='Chinese'}, Course{name='Physics'}]}"
}

可以看到,當我們使用淺度copy時,修改新對象的屬性會導致原對象的屬性也受到影響;而使用深度copy時,原對象的屬性不會受到新對象屬性的影響。