色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

java深拷貝和淺拷貝面試題

錢淋西1年前7瀏覽0評論

Java中的對象拷貝,可以分為深拷貝和淺拷貝。

淺拷貝是指只拷貝對象本身,而不拷貝對象內部引用的其他對象。例如:

#定義一個Person類
public class Person {
private String name;
private Car car;
//構造函數和setter, getter方法省略
}
#定義一個Car類
public class Car {
private String brand;
//getter和setter方法省略
}
#進行淺拷貝
Person person1 = new Person();
(person1).setName("張三");
Car car1 = new Car();
car1.setBrand("BMW");
(person1).setCar(car1);
Person person2 = (Person) person1.clone();
(person2).setCar(car1);
(person2).getCar().setBrand("Benz");
System.out.println((person1).getCar().getBrand());//輸出 "Benz"

可以看到,淺拷貝時,雖然person2和person1指向不同的對象,但是他們的car實例都是指向同一個對象,那么如果對其中一個對象進行修改,另一個對象的內容也會發生改變。

而深拷貝則是指將整個對象及其引用的所有對象都進行完全拷貝,例如:

#進行深拷貝
Person person1 = new Person();
(person1).setName("張三");
Car car1 = new Car();
car1.setBrand("BMW");
(person1).setCar(car1);
Person person2 = (Person) person1.deepClone();
(person2).setCar(car1);
(person2).getCar().setBrand("Benz");
System.out.println((person1).getCar().getBrand());//輸出 "BMW"

可以看到,深拷貝時,即使person2和person1指向的是不同的對象,它們的car實例也都被完全拷貝了一份,那么對其中一個對象進行的修改,不會影響另一個對象。

需要注意的是,進行深拷貝必須讓被拷貝的對象實現Cloneable接口并重寫clone()方法,在clone()方法內部,對所有涉及到的引用對象也進行一次深拷貝。例如:

class Person implements Cloneable {
private String name;
private Car car;
//省略構造函數和setter, getter方法
@Override
public Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
person.setCar((Car) car.clone());
return person;
}
}
class Car implements Cloneable{
private String brand;
//省略構造函數和setter, getter方法
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

不同的應用場景需要使用不同的拷貝方法,例如使用淺拷貝可以提高性能,因為只拷貝部分內容,使用深拷貝能夠保證數據完整性,但是性能比較低。在選擇拷貝方法時,需要根據具體場景和需求進行選擇。