在Java中,對象的復制可以使用淺拷貝和深拷貝兩種方法。雖然這兩種方式的目的都是為了復制對象,但是它們的實現方式和實現效果卻有許多不同。
淺拷貝是指在復制對象時,只復制對象的引用而不是對象本身。簡單來說,就是將原對象中的成員變量的地址直接復制給新對象。因此,新對象與原對象共享相同的成員變量。這種方式的好處是可以節省內存空間,但是如果其中任何一個對象對共享成員變量進行了修改,另一個對象也會受到影響。
// 淺拷貝實現代碼示例 class Person implements Cloneable { String name; Address address; public Person clone() throws CloneNotSupportedException { return (Person) super.clone(); } } class Address { String city; } Person person1 = new Person(); person1.name = "Tom"; person1.address = new Address(); Person person2 = person1.clone(); // 淺拷貝 person2.name = "Jerry"; System.out.println(person1.name); // Tom System.out.println(person2.name); // Jerry person2.address.city = "New York"; // 修改共享成員變量 System.out.println(person1.address.city); // New York
深拷貝是指在復制對象時,將原對象中的所有成員變量都復制一份到新對象中,新對象與原對象互不干擾,各自擁有獨立的成員變量。因此,深拷貝需要更多的內存空間。但是如果需要修改其中一個對象的成員變量,不會影響到另一個對象的成員變量。
// 深拷貝實現代碼示例 class Person implements Cloneable { String name; Address address; public Person clone() throws CloneNotSupportedException { Person person = (Person) super.clone(); person.address = (Address) address.clone(); return person; } } class Address implements Cloneable { String city; public Address clone() throws CloneNotSupportedException { return (Address) super.clone(); } } Person person1 = new Person(); person1.name = "Tom"; person1.address = new Address(); Person person2 = person1.clone(); // 深拷貝 person2.name = "Jerry"; System.out.println(person1.name); // Tom System.out.println(person2.name); // Jerry person2.address.city = "New York"; // 修改不共享成員變量 System.out.println(person1.address.city); // null System.out.println(person2.address.city); // New York
在面試中,通常會詢問候選人對淺拷貝和深拷貝的理解以及區別,以此考察候選人的Java基礎知識。如果候選人能夠清晰地解釋這兩種拷貝方式的原理和實現,并且能夠手寫出相應的代碼,那么就能夠給面試官留下良好的印象。
上一篇php iis 403
下一篇css中span文字空格