Perbezaan antara salinan cetek dan salinan dalam: Salinan cetek: Cipta objek yang merujuk data yang sama dan menukar salinan juga akan menjejaskan objek asal. Salinan dalam: Buat objek yang mengandungi salinan data objek asal Menukar salinan tidak akan menjejaskan objek asal.
Shallow Copy dan Deep Copy dalam Java
Pengenalan
Di Jawa, memahami konsep salinan cetek dan salinan dalam adalah penting untuk operasi objek. Tutorial ini memperincikan perbezaan antara keduanya dan menggambarkannya dengan contoh kod.
Salinan cetek
Contoh Kod:
class Person { private String name; private Address address; } public class ShallowCopyDemo { public static void main(String[] args) { Person p1 = new Person(); p1.setName("John Doe"); Address addr = new Address(); addr.setStreet("123 Main St."); p1.setAddress(addr); // Shallow copy Person p2 = p1; // 更改 p2 的地址 p2.getAddress().setStreet("456 Elm St."); // p1 的地址也发生了变化 System.out.println(p1.getAddress().getStreet()); // 输出:456 Elm St. } }
Dalam contoh ini, p2
ialah salinan cetek p1
dan ia merujuk objek Alamat
yang sama . Oleh itu, perubahan pada alamat p2
juga akan mempengaruhi p1
. p2
是 p1
的浅拷贝,它们引用相同的 Address
对象。因此,对 p2
的地址进行更改也会影响 p1
。
深拷贝
代码示例:
使用 clone()
方法或第三方库(如 Apache Commons Lang)来实现深拷贝。
使用 clone() 方法:
class Person implements Cloneable { private String name; private Address address; @Override public Person clone() { try { // 使用 super.clone() 创建新对象 return (Person) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } } public class DeepCopyDemo { public static void main(String[] args) { Person p1 = new Person(); p1.setName("John Doe"); Address addr = new Address(); addr.setStreet("123 Main St."); p1.setAddress(addr); // Deep copy Person p2 = p1.clone(); // 更改 p2 的地址 p2.getAddress().setStreet("456 Elm St."); // p1 的地址保持不变 System.out.println(p1.getAddress().getStreet()); // 输出:123 Main St. } }
在此示例中,clone()
方法为 p1
创建了一个深拷贝。更改 p2
的地址不会影响 p1
,因为它们引用不同的 Address
Salinan dalam
Contoh kod:
🎜🎜Gunakan kaedahclone()
atau pustaka pihak ketiga (seperti Apache Commons Lang) untuk melaksanakan salinan dalam. 🎜🎜🎜Menggunakan kaedah klon(): 🎜🎜rrreee🎜Dalam contoh ini, kaedah clone()
mencipta salinan mendalam p1
. Menukar alamat p2
tidak akan menjejaskan p1
kerana ia merujuk kepada objek Alamat
yang berbeza. 🎜🎜🎜Bila menggunakan salinan dalam atau salinan cetek? 🎜🎜🎜🎜🎜Salinan cetek: 🎜Salinan cetek boleh dilakukan apabila tiada kesan sampingan untuk mengubah suai salinan objek. 🎜🎜🎜Salinan Dalam: 🎜Salinan dalam diperlukan apabila mengubah suai salinan objek yang mungkin menjejaskan objek asal. 🎜🎜🎜Sebagai contoh, sentiasa gunakan salinan dalam apabila menyimpan objek atau menghantarnya kepada kod yang tidak dipercayai. 🎜Atas ialah kandungan terperinci Apakah perbezaan antara salinan cetek dan salinan dalam di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!