'Shallow' oder 'tief' - und das ist eine Sache, die ich niemand sehen, genau zu definieren - die Methode Arrays.copyOf(..)
in der Praxis produziert eine Kopie des Quell-Arrays, das von Änderungen am Quell-Array nicht betroffen ist.
Nehmen Sie das folgende einfache Beispiel mit int-Arrays:
import java.util.Arrays;
public class DeepCopyTest
{
public static void main(String[] args)
{
int[] source = { 1, 2, 3, 4, 5, 6};
int[] target = new int[source.length];
// Copy target from source via Arrays.copyOf(..) method :
target = Arrays.copyOf(source, 6);
// Check for equality :
System.out.println("Source1 : " + Arrays.toString(source));
System.out.println("Target1 : " + Arrays.toString(target));
// Increment all entries in source array :
for(int i = 0; i < source.length; i++)
{
source[i] = source[i] +1;
}
// See if target is affected :
System.out.println("Source2 : " + Arrays.toString(source));
System.out.println("Target2 : " + Arrays.toString(target));
}
}
// OUTPUT
// ------
Source1 : [1, 2, 3, 4, 5, 6]
Target1 : [1, 2, 3, 4, 5, 6]
Source2 : [2, 3, 4, 5, 6, 7]
Target2 : [1, 2, 3, 4, 5, 6]
In der Praxis, wenn die Menschen eine „tiefe Kopie“ eines Arrays suchen, sie nur wollen etwas, das durch Änderungen an der ursprünglichen nicht beeinträchtigt wird.
Und diese Arrays.copyOf (..) `Methode gibt ihnen dies.
Neben Urtyp Arrays Objekt String-Arrays auch als das obige Beispiel verhalten, wie die Aufgabe Ausgang:
Source1 : [a, b, c, d, e, f]
Target1 : [a, b, c, d, e, f]
Source2 : [a1, b1, c1, d1, e1, f1]
Target2 : [a, b, c, d, e, f]
wenn die anfänglichen Quellenarray Einträge von „1“ verkettet sind.
Es funktioniert auch für Objekt-Arrays in dem Sinne, dass das Ziel nicht mehr an die Quelle gebunden ist, wenn letztere neu zugewiesen wird. ABER am Ausgang für das erste Element der beiden Arrays nach dem Kopieren sucht und dann nach Quelle zu verändern [0] zeigt die volle Wahrheit:
Source1 : [email protected]
Target1 : [email protected]
Source2 : [email protected]
Target2 : [email protected]
Nachdem der ursprüngliche Quelle Array kopiert wird, einfach die Zielelemente hingewiesen worden zu welchen Werten auch immer in ihren Quellgegenstücken gehalten werden. Für Ziel [0] ist es der Inhalt der Speicheradresse 1db9742 - dies ist auch die gleiche Speicheradresse, die die Quelle [0] enthält. . . .
Und der Grund, warum wir eine Entbindungs zwischen Quelle und Ziel nach Quelle erhalten [0] zugewiesen wird, ist aufgrund der Tatsache, dass die Zuweisungsanweisung
source[0] = new Object();
einfach bewirkt, dass die Speicherreferenz in Quelle gehalten [0] bis an einem neuen Ort geändert werden, während auf ein neues Objekt gezeigt wird. Es handelt sich also nicht um eine echte tiefe Kopie im reinen Sinne, obwohl es in vielen Fällen dem Programmierer die gleichen Vorteile wie eine tiefe Kopie gibt.
Bei Arrays primitiver Daten kann die Methode "Arrays.copyOf (..)" keine Referenzen kopieren, da diese nicht für Grundelemente verwendet werden. Es kopiert nur die Quellelementwerte in die Zielelemente. Wiederum haben wir dieselbe Wirkung wie eine tiefe Kopie auf Kosten einer Operation, die viel weniger Code benötigt als für eine tiefe Kopie.
Also Arrays.copyOf (..) ist eine 'billige' tiefe Kopie für primitive und 1-D Object-Arrays. Aber jedes Datenfeld ist komplexer und es wird herausgefunden.
Vielleicht sollte es eine halbtiefe Kopie genannt werden.
Wahrscheinlich nur ein weiteres Auftreten von Internierung von Strings – Matthias
@Matthias: Ich kann nicht so denken. Da "Foo" ein Literal ist, wird es interniert; Die Tests gehen davon aus. Wenn diese Annahme richtig ist, dann untersuchen die Tests, ob das Zielelement durch '=" Bar "' des entsprechenden Quellelements geändert wurde. – ToolmakerSteve
Ich sehe nicht, wo die Tests eine Annahme darüber machen, ob Strings internalisiert werden oder nicht.Ich sehe keine Identitätstests, ich sehe nur Gleichheitstests. Die Ergebnisse wären für flache und tiefe Kopien identisch, da Gleichheitstests nicht zwischen flachen und tiefen Kopien unterscheiden können. Man benötigt Identitätsprüfungen, um zwischen flachen und tiefen Kopien zu unterscheiden. –