Maison  >  Article  >  Java  >  Quelle est la différence entre la copie superficielle et la copie profonde en Java ?

Quelle est la différence entre la copie superficielle et la copie profonde en Java ?

PHPz
PHPzoriginal
2024-04-11 12:33:011156parcourir

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.

Quelle est la différence entre la copie superficielle et la copie profonde en Java ?

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

  • Crée un nouvel objet qui fait référence aux mêmes données sous-jacentes de l'objet d'origine.
  • Toute modification apportée à la copie superficielle sera également répercutée sur l'objet original et vice versa.
  • Suivez le principe "même référence".

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. p2p1 的浅拷贝,它们引用相同的 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

    Crée un nouvel objet qui contient une copie indépendante des données sous-jacentes de l'objet d'origine.
  • La modification de la copie complète n'affectera pas l'objet original et vice versa.
  • Suivez le principe du "
  • même contenu".

Exemple de code :

🎜🎜Utilisez la méthode clone() 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn