Ben ise çağırmak clone()
A tipi Nesnelerin dizisinde yöntemle, nasıl onun öğeleri çoğaltabilir olacak? Kopya aynı nesnelere mi başvuruyor? Yoksa (element of type A).clone()
her birini arayacak mı?
Yanıtlar:
clone()
sığ bir kopya oluşturur. Bu, öğelerin klonlanmayacağı anlamına gelir. (Ya uygulamadılarsa Cloneable
?)
Bunun Arrays.copyOf(..)
yerine dizileri kopyalamak için kullanmak isteyebilirsiniz clone()
(ancak klonlama diziler için iyidir, başka hiçbir şeyin aksine)
Derin klonlama istiyorsanız, bu yanıtı kontrol edin
clone()
Öğeler olsa bile sığlığını göstermek için küçük bir örnek Cloneable
:
ArrayList[] array = new ArrayList[] {new ArrayList(), new ArrayList()};
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("-----");
}
Baskılar:
4384790
4384790
9634993
-----
1641745
1641745
11077203
-----
System.arrayCopy
clone()
dizilerle kullanmak için iyi bir seçenektir .. neredeyse yalnızca. Bloch, onu yalnızca diziler için kullanacağını ve başka hiçbir şey için kullanmayacağını söylüyor. System.arrayCopy
iyidir. Arrays.copyOf(..)
kullanımı daha kolay olan başka bir alternatiftir.
Arrays.copyOf
:-) Değişkenleri basitleştiren bir yöntem imzası var (evet sizi sınırlıyor, ancak çoğu durumda mükemmel) ve en azından benim JDK'mda, System.arrayCopy
yine de kullanılarak uygulanıyor . Bu ipucu için teşekkürler!
array[i].clone()
işaret ETMEZ array[i]
. Örneğin bu kısmının gösterdiği şey bu.
1D ilkel dizisi, klonlandığında öğeleri kopyalar. Bu bizi 2D diziyi (Dizi Dizisi) klonlamaya teşvik ediyor.
2D dizi klonunun clone()
,.
public static void main(String[] args) {
int row1[] = {0,1,2,3};
int row2[] = row1.clone();
row2[0] = 10;
System.out.println(row1[0] == row2[0]); // prints false
int table1[][]={{0,1,2,3},{11,12,13,14}};
int table2[][] = table1.clone();
table2[0][0] = 100;
System.out.println(table1[0][0] == table2[0][0]); //prints true
}
clone
boyutlu ilkel dizileri yapıp derin bir kopya alabileceğimi mi söylüyorsun ? Bu harika! İyi ücret Arrays.copyOfRange()
, System.arraycopy()
!
Klon, dizinin sığ bir kopyasıdır.
Bu test kodu şunu yazdırır:
[1, 2] / [1, 2] [100, 200] / [100; 2]
çünkü MutableInteger
her iki dizide objects[0]
ve olarak paylaşılır objects2[0]
, ancak referansı objects[1]
öğesinden bağımsız olarak değiştirebilirsiniz objects2[1]
.
import java.util.Arrays;
public class CloneTest {
static class MutableInteger {
int value;
MutableInteger(int value) {
this.value = value;
}
@Override
public String toString() {
return Integer.toString(value);
}
}
public static void main(String[] args) {
MutableInteger[] objects = new MutableInteger[] {
new MutableInteger(1), new MutableInteger(2) };
MutableInteger[] objects2 = objects.clone();
System.out.println(Arrays.toString(objects) + " / " +
Arrays.toString(objects2));
objects[0].value = 100;
objects[1] = new MutableInteger(200);
System.out.println(Arrays.toString(objects) + " / " +
Arrays.toString(objects2));
}
}