Klont der Aufruf von clone () in einem Array auch dessen Inhalt?
92
Wenn ich eine clone()Methode für ein Array von Objekten vom Typ A aufrufe, wie klont sie dann ihre Elemente? Verweist die Kopie auf dieselben Objekte? Oder wird es (element of type A).clone()für jeden von ihnen verlangen ?
clone()erstellt eine flache Kopie. Dies bedeutet, dass die Elemente nicht geklont werden. (Was ist, wenn sie nicht implementiert haben Cloneable?)
Möglicherweise möchten Sie zum Arrays.copyOf(..)Kopieren von Arrays anstelle von verwenden clone()(obwohl das Klonen für Arrays im Gegensatz zu anderen Elementen in Ordnung ist).
Ein kleines Beispiel zur Veranschaulichung der Oberflächlichkeit von clone() selbst wenn die Elemente sind Cloneable:
ArrayList[] array =newArrayList[]{newArrayList(),newArrayList()};ArrayList[] clone = array.clone();for(int i =0; i < clone.length; i ++){System.out.println(System.identityHashCode(array[i]));System.out.println(System.identityHashCode(clone[i]));System.out.println(System.identityHashCode(array[i].clone()));System.out.println("-----");}
Und wenn Sie das tun würden, würde ich persönlichSystem.arrayCopy
corsiKa
1
clone()ist eine gute Option für Arrays. Fast ausschließlich. Bloch erwähnt, dass er es nur für Arrays und sonst nichts verwenden würde. System.arrayCopyist gut. Arrays.copyOf(..)ist eine weitere Alternative, die einfacher zu bedienen ist.
Bozho
Ich nehme es zurück - ich würde es benutzen Arrays.copyOf :-) Es hat eine Methodensignatur, die die Variablen vereinfacht (ja, es schränkt Sie ein, aber es ist für die meisten Fälle perfekt) und zumindest in meinem JDK wird es mit implementiert System.arrayCopy. Danke für diesen Tipp!
CorsiKa
@Bozho, von deinem zB. Array [i] und Klon [i] beziehen sich auf dasselbe Objekt, sodass die ersten beiden Sysouts identisch sind. Array [i] .clone würde sich aber auch auf Array [i] selbst beziehen. Warum gibt Array [i] .clone () einen anderen Hashcode-Wert zurück?
Abhihello123
@weakstudent, array[i].clone()bezieht sich NICHT auf array[i]. Das zeigt dieser Teil des Beispiels.
Dathan
19
Wie klone es seine Elemente, wenn ich die Methode clone () für ein Array von Objekten vom Typ A aufrufe?
Die Elemente des Arrays werden nicht geklont.
Verweist die Kopie auf dieselben Objekte?
Ja.
Oder wird es (Element vom Typ A) .clone () für jeden von ihnen aufrufen?
Nein, es wird clone()keines der Elemente aufgerufen .
Wollen Sie mir sagen, dass ich clone1D-Primitive erstellen und eine tiefe Kopie erhalten kann? Das ist so großartig! Fare gut Arrays.copyOfRange(), System.arraycopy()!
Janez Kuhar
1
Yessssss! 1D-Array von
Grundelementen
1
Beachten Sie, dass Thamme Gowda N "Primitive" sagt. Klone von Arrays von Objekten sind nur ein Klon von Referenzen.
Kristiaan
Da Primitive keinen Zustand haben, sind sie von Natur aus unveränderlich. Sie können keine flache Kopie von
Xerus
5
Der Klon ist eine flache Kopie des Arrays.
Dieser Testcode druckt:
[1, 2] / [1, 2]
[100, 200] / [100, 2]
weil das MutableIntegerin beiden Arrays als objects[0]und geteilt wird objects2[0], aber Sie können die Referenz objects[1]unabhängig von ändern objects2[1].
Antworten:
clone()
erstellt eine flache Kopie. Dies bedeutet, dass die Elemente nicht geklont werden. (Was ist, wenn sie nicht implementiert habenCloneable
?)Möglicherweise möchten Sie zum
Arrays.copyOf(..)
Kopieren von Arrays anstelle von verwendenclone()
(obwohl das Klonen für Arrays im Gegensatz zu anderen Elementen in Ordnung ist).Wenn Sie tiefes Klonen wünschen, überprüfen Sie diese Antwort
Ein kleines Beispiel zur Veranschaulichung der Oberflächlichkeit von
clone()
selbst wenn die Elemente sindCloneable
:Drucke:
quelle
System.arrayCopy
clone()
ist eine gute Option für Arrays. Fast ausschließlich. Bloch erwähnt, dass er es nur für Arrays und sonst nichts verwenden würde.System.arrayCopy
ist gut.Arrays.copyOf(..)
ist eine weitere Alternative, die einfacher zu bedienen ist.Arrays.copyOf
:-) Es hat eine Methodensignatur, die die Variablen vereinfacht (ja, es schränkt Sie ein, aber es ist für die meisten Fälle perfekt) und zumindest in meinem JDK wird es mit implementiertSystem.arrayCopy
. Danke für diesen Tipp!array[i].clone()
bezieht sich NICHT aufarray[i]
. Das zeigt dieser Teil des Beispiels.Die Elemente des Arrays werden nicht geklont.
Ja.
Nein, es wird
clone()
keines der Elemente aufgerufen .quelle
1D-Array von Grundelementen kopiert Elemente, wenn es geklont wird. Dies verleitet uns dazu, ein 2D-Array (Array of Arrays) zu klonen.
Denken Sie daran, dass der 2D-Array-Klon aufgrund der Implementierung einer flachen Kopie von nicht funktioniert
clone()
.quelle
clone
1D-Primitive erstellen und eine tiefe Kopie erhalten kann? Das ist so großartig! Fare gutArrays.copyOfRange()
,System.arraycopy()
!Der Klon ist eine flache Kopie des Arrays.
Dieser Testcode druckt:
weil das
MutableInteger
in beiden Arrays alsobjects[0]
und geteilt wirdobjects2[0]
, aber Sie können die Referenzobjects[1]
unabhängig von ändernobjects2[1]
.quelle