Maison >Java >javaDidacticiel >Quelle est la différence entre la copie superficielle et la copie profonde en Java ?
La différence entre la copie superficielle et la copie profonde : Copie superficielle : créez un objet qui fait référence aux mêmes données, et la modification de la copie affectera également l'objet d'origine. Copie complète : créez un objet contenant une copie des données de l'objet d'origine. La modification de la copie n'affectera pas l'objet d'origine.
Copie superficielle et copie profonde en Java
Introduction
En Java, comprendre les concepts de copie superficielle et de copie profonde est crucial pour les opérations sur les objets. Ce didacticiel détaille les différences entre les deux et les illustre avec des exemples de code.
Copie superficielle
Exemple de code :
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. } }
Dans cet exemple, p2
est une copie superficielle de p1
et ils font référence au même objet Adresse
. Par conséquent, les modifications apportées à l'adresse de p2
affecteront également 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
Copie approfondie
Exemple de code :
🎜🎜Utilisez la méthodeclone()
ou une bibliothèque tierce (telle qu'Apache Commons Lang) pour implémenter la copie approfondie. 🎜🎜🎜Utilisation de la méthode clone() : 🎜🎜rrreee🎜Dans cet exemple, la méthode clone()
crée une copie complète de p1
. Changer l'adresse de p2
n'affectera pas p1
car ils font référence à des objets Address
différents. 🎜🎜🎜Quand utiliser la copie profonde ou la copie superficielle ? 🎜🎜🎜🎜🎜Copie superficielle : 🎜Une copie superficielle peut être effectuée lorsqu'il n'y a aucun effet secondaire sur la modification de la copie de l'objet. 🎜🎜🎜Copie approfondie : 🎜Une copie approfondie est nécessaire lors de la modification d'une copie d'un objet pouvant affecter l'objet d'origine. 🎜🎜🎜 Par exemple, utilisez toujours des copies complètes lorsque vous mettez des objets en cache ou que vous les transmettez à du code non fiable. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!