Bir dizide clone () çağrısı da içeriğini klonlar mı?


92

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ı?


3
Her elemanda klon çağırmalısınız.
Peter Lawrey

Yanıtlar:


77

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

2
Ve eğer bunu yapacak olsaydın, şahsen kullanırdımSystem.arrayCopy
corsiKa

1
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.arrayCopyiyidir. Arrays.copyOf(..)kullanımı daha kolay olan başka bir alternatiftir.
Bozho

Geri alıyorum - kullanırım 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.arrayCopyyine de kullanılarak uygulanıyor . Bu ipucu için teşekkürler!
corsiKa

@Bozho, sizin örn. dizi [i] ve klon [i] aynı nesneye başvurur, böylece ilk iki sistem aynı olur. Ancak [i] .clone dizisi [i] dizisinin kendisine de başvurur, öyleyse neden [i] .clone () dizisi farklı bir karma kod değeri döndürür?
abhihello123

@weakstudent, array[i].clone()işaret ETMEZ array[i]. Örneğin bu kısmının gösterdiği şey bu.
Dathan

19

A türündeki Nesneler dizisi üzerinde clone () yöntemini çağırırsam, öğelerini nasıl klonlar?

Dizinin elemanları klonlanmayacaktır.

Kopya aynı nesnelere mi başvuruyor?

Evet.

Yoksa her biri için (A tipi eleman) .clone () çağıracak mı?

Hayır, clone()herhangi bir unsuru çağırmayacak .


6

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
}

1
Bana 1 cloneboyutlu ilkel dizileri yapıp derin bir kopya alabileceğimi mi söylüyorsun ? Bu harika! İyi ücret Arrays.copyOfRange(), System.arraycopy()!
Janez Kuhar

1
Yessssss! Dizi klonlandığında
boyutlu

1
Thamme Gowda N'nin "ilkeller" dediğine dikkat edin. Nesne dizilerinin klonları yalnızca referansların bir klonu olacaktır.
Kristiaan

ilkellerin durumu olmadığı için, doğaları gereği değişmezler. Referans olmadığı için ilkellerin sığ bir kopyasını
yapamazsınız

5

Klon, dizinin sığ bir kopyasıdır.

Bu test kodu şunu yazdırır:

[1, 2] / [1, 2]
[100, 200] / [100; 2]

çünkü MutableIntegerher 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));                                                               
    }                                                                                                                                                    
}                                                                                                                                                        
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.