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) { List courses = 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時,原對象的屬性不會受到新對象屬性的影響。
上一篇php img src