Heim  >  Artikel  >  Java  >  Was ist der Unterschied zwischen flachem Kopieren und tiefem Kopieren in Java?

Was ist der Unterschied zwischen flachem Kopieren und tiefem Kopieren in Java?

PHPz
PHPzOriginal
2024-04-11 12:33:011158Durchsuche

Der Unterschied zwischen flacher Kopie und tiefer Kopie: Flache Kopie: Erstellen Sie ein Objekt, das auf dieselben Daten verweist. Eine Änderung der Kopie wirkt sich auch auf das Originalobjekt aus. Tiefe Kopie: Erstellen Sie ein Objekt, das eine Kopie der Daten des Originalobjekts enthält. Das Ändern der Kopie hat keine Auswirkungen auf das Originalobjekt.

Was ist der Unterschied zwischen flachem Kopieren und tiefem Kopieren in Java?

Shallow Copy und Deep Copy in Java

Einführung

In Java ist das Verständnis der Konzepte von Shallow Copy und Deep Copy für Objektoperationen von entscheidender Bedeutung. In diesem Tutorial werden die Unterschiede zwischen den beiden detailliert beschrieben und anhand von Codebeispielen veranschaulicht.

Flache Kopie

  • Erstellt ein neues Objekt, das auf dieselben zugrunde liegenden Daten des Originalobjekts verweist.
  • Alle Änderungen an der flachen Kopie werden auch auf das Originalobjekt übertragen und umgekehrt.
  • Folgen Sie dem Prinzip „gleiche Referenz“.

Codebeispiel:

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.
    }
}

In diesem Beispiel ist p2 eine flache Kopie von p1 und sie verweisen auf dasselbe Address-Objekt . Daher wirken sich Änderungen an der Adresse von p2 auch auf p1 aus. 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

Deep Copy

    Erstellt ein neues Objekt, das eine unabhängige Kopie der zugrunde liegenden Daten des Originalobjekts enthält.
  • Das Ändern der tiefen Kopie hat keine Auswirkungen auf das Originalobjekt und umgekehrt.
  • Folgen Sie dem „
  • same content“-Prinzip.

Codebeispiel:

🎜🎜Verwenden Sie die Methode clone() oder eine Bibliothek eines Drittanbieters (z. B. Apache Commons Lang), um Deep Copy zu implementieren. 🎜🎜🎜Verwendung der clone()-Methode: 🎜🎜rrreee🎜In diesem Beispiel erstellt die clone()-Methode eine tiefe Kopie von p1. Das Ändern der Adresse von p2 hat keine Auswirkungen auf p1, da diese sich auf verschiedene Address-Objekte beziehen. 🎜🎜🎜Wann sollte man Deep Copy oder Shallow Copy verwenden? 🎜🎜🎜🎜🎜Flache Kopie: 🎜Eine flache Kopie kann durchgeführt werden, wenn beim Ändern der Kopie des Objekts keine Nebenwirkungen auftreten. 🎜🎜🎜Deep Copy: 🎜Eine Deep Copy ist erforderlich, wenn eine Kopie eines Objekts geändert wird, die sich auf das Originalobjekt auswirken kann. 🎜🎜🎜Verwenden Sie beispielsweise immer tiefe Kopien, wenn Sie Objekte zwischenspeichern oder an nicht vertrauenswürdigen Code übergeben. 🎜

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen flachem Kopieren und tiefem Kopieren in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn