Java Kopieren/Vergleichen von NICHT primitiven Typen, tiefe Kopie

Sponny

Lt. Commander
Registriert
März 2008
Beiträge
1.060
Hallo liebe Community,

ich habe ein paar Fragen zum Kopieren und Vergleichen.

Kopieren:

Wenn ich alle NICHT primitiven Typen also Arrays und eigene Klassen mit clone kopiere (Die eigenen Klassen haben dabei die Clone Methode implementiert bzw. redefiniert), erhalte ich dann bedenkenlos eine Tiefekopie? Ich habe gelesen, dass vorallem bei der Vererbung clone() zu empfehlen ist. (wg. dynamischen Binden)

Oder ist es bei manchen Fällen besser mit Schleifen oder Kopierkonstruktoren zu kopieren?

Vergleichen:

Ist beim Vergleichen von mehr- bzw. eindimensionalen Arrays die Methode Arrays.deepEquals(a, b) ausreichend, oder sollte auch hier auf Schleifen zurückgegriffen werden?

Vielen Dank im Voraus für eure Hilfe.
 
Zuletzt bearbeitet:
Zum Kopieren:

Deep Copys werden von Haus aus nicht unterstützt. Ein clone bei Arrays kopiert die darunterliegenden Objekte nicht. Es ist ja nicht garantiert, dass diese das Cloneable-Interface implementieren.
-> Entweder man arbeitet mit Schleifen- und Kopierkonstrukten oder aber man sucht sich eine Bibliothek, die die Funktionalität bereitstellt (Es gibt zahlreiche Cloning-Librarys. Will an dieser Stelle keine empfehlen, da ich die Funktionalität bislang nie benötigt habe)


Zum Vergleichen:

Siehe JavaDoc: http://docs.oracle.com/javase/8/doc...Equals-java.lang.Object:A-java.lang.Object:A-

Returns true if the two specified arrays are deeply equal to one another. Unlike the equals(Object[],Object[]) method, this method is appropriate for use with nested arrays of arbitrary depth.

Two array references are considered deeply equal if both are null, or if they refer to arrays that contain the same number of elements and all corresponding pairs of elements in the two arrays are deeply equal.

Two possibly null elements e1 and e2 are deeply equal if any of the following conditions hold:

  • e1 and e2 are both arrays of object reference types, and Arrays.deepEquals(e1, e2) would return true
  • e1 and e2 are arrays of the same primitive type, and the appropriate overloading of Arrays.equals(e1, e2) would return true.
  • e1 == e2
  • e1.equals(e2) would return true.


Note that this definition permits null elements at any depth.

If either of the specified arrays contain themselves as elements either directly or indirectly through one or more levels of arrays, the behavior of this method is undefined.

-> Objekte müssen eine passende equals-Methode bereitstellen, damit das Ergebnis stimmt. Vorteil von deepEquals ist eben, dass mehrdimensionale Arrays unterstützt werden
 
Vielen Dank für deine umfangreiche Antwort! (-:
 
Kurze Antwort zum Kopieren: nimm das Objekt, das Du kopieren möchtest und serialize/deserialize es und Du hast eine (echte) Kopie davon.
 
Wieso nicht einfach die equals() überschreiben und selbst definieren was "gleich" ist ?
Equals funktioniert ohnehin nur bei den eingebauten Dingen richtig.
 
Zurück
Oben