java copy array how copy clone an array java
Dizilerin Kopyalanması ve Klonlanması Üzerine Bu Öğretici, Java'da Dizi Kopyalamak için Çeşitli Yöntemleri Açıklamaktadır:
Burada Java dizilerinin kopyalama işlemini tartışacağız. Java, dizi öğelerinin kopyalarını yapabileceğiniz çeşitli yollar sağlar. Bildiğimiz gibi, Java'da diziler, ilkel türlerden veya nesnelerden veya referanslardan öğeler içerebilir.
İlkel türlerin kopyalarını yaparken görev oldukça kolaydır, ancak nesneler veya referanslar söz konusu olduğunda kopyanın derin veya sığ olmasına dikkat etmeniz gerekir.
=> Java Yeni Başlayanlar Kılavuzuna Bir Göz Atın.
Sığ kopya, öğenin bir kopyasını oluşturur. İlkel veri türleri söz konusu olduğunda sorun olmaz. Ancak referanslar söz konusu olduğunda, basit bir kopya, temel bilgileri değil, yalnızca değeri kopyalayacaktır.
Böylece, öğelerin kopyalarını yapmış olsanız bile, bir kopyadaki değişiklik, bellek konumları paylaşıldıkça diğer kopyaya da yansıyacaktır. Bunu önlemek için, hafıza konumlarının paylaşılmadığı derin bir kopyaya gitmeniz gerekir.
Ne öğreneceksin:
Java Dizilerini Kopyalama ve Klonlama
Java, java.util veya System sınıfı tarafından sağlanan doğrudan kopyalama yöntemini kullanarak dizileri kopyalamanıza izin verir. Ayrıca, tüm diziyi klonlamak için kullanılan bir klon yöntemi sağlar.
Bu eğitimde, aşağıdaki Dizileri Kopyalama ve Klonlama yöntemlerini tartışacağız.
- For döngüsü kullanarak manuel kopyalama
- System.arraycopy () kullanarak
- Arrays.copyOf () kullanma
- Arrays.copyOfRange () kullanma
- Object.clone () kullanma
Hadi keşfedelim!!
Döngü İçin Kullanarak Manuel Kopyalama
Normalde, a ve b gibi değişkenleri kopyaladığımızda, kopyalama işlemini şu şekilde gerçekleştiririz:
a = b;
Aynı yöntemi dizilere uygularsak doğru çalışmayacaktır.
Bir programlama örneği görelim.
public class Main { public static void main(String() args) { int intArray() = {12,15,17}; //print original intArray System.out.println('Contents of intArray() before assignment:'); for (int i=0; i Çıktı:
Yukarıdaki programda iki dizi vardır, yani intArray ve copyArray. Görev, intArray'in içeriğini copyArray'e kopyalamaktır. Bunu yapmak için copyArray = intArray ifadesi tanıtıldı. Burada yapılan, dizinin referanslarının atanmasıdır. Dolayısıyla bu gerçek bir kopyalama değildir.
Yukarıdaki ifadenin bir sonucu olarak, intArray'in bellek konumu da copyArray tarafından paylaşılır. Artık copyArray öğesi artırıldığında, bu değişiklik intArray'e de yansıtılır. Bu çıktıda gösterilir.
Bu sorunun üstesinden gelmek için, diziyi for döngüsünü kullanarak kopyalamak için bir yöntem kullanıyoruz. Burada, orijinal dizinin her bir öğesi bir for döngüsü kullanılarak yeni diziye kopyalanır.
Bu program aşağıda gösterilmiştir.
public class Main { public static void main(String() args) { int intArray() = {12,15, 17}; // define an array copyArray to copy contents of intArray int copyArray() = new int(intArray.length); // copy contents of intArray to copyArray for (int i=0; i Çıktı:
Burada önceki programı for döngüsünü ve içinde for döngüsünü içerecek şekilde değiştirdik, her intArray öğesini copyArray öğesinin karşılık gelen öğesine atarız. Bu şekilde, öğeler aslında kopyalanır. Yani bir dizi değiştirildiğinde, değişiklikler başka bir diziye yansımaz.
System.arraycopy () kullanarak
Java’nın System sınıfı, bir dizinin öğelerini başka bir diziye kopyalamanıza izin veren 'ArrayCOpy' adlı bir yönteme sahiptir.
Bu yöntemin genel prototipi aşağıdaki gibidir:
public static void arraycopy( Object src_array, int src_Pos,Object dest_array, int dest_Pos, int length )
Buraya,
- src_array => İçeriğin kopyalanacağı kaynak dizisi.
- src_Pos => Kopyalamanın başlayacağı kaynak dizideki konum.
- dest_array => Elemanların kopyalanacağı hedef dizi.
- dest_Pos => Kopyalanacak elemanlar için hedef dizideki başlangıç konumu.
- uzunluk => Kopyalanacak dizinin uzunluğu.
Bu yöntemi bir örnekle anlayalım.
class Main { public static void main(String() args) { //declaring a source array char() src_array = { 'S','o','f','t','w','a','r','e','T','e','s','t','i','n','g','H','e','l','p'}; char() dest_array = new char(19); System.arraycopy(src_array, 0, dest_array, 0,19); System.out.println('Source array:' + String.valueOf(src_array)); System.out.println('Destination array after arraycopy:'+ String.valueOf(dest_array)); } }
Çıktı:
Yukarıdaki programda, bir diziyi başka bir diziye kopyalamak için 'dizi kopyalama' yöntemini kullanıyoruz. Arraycopy yöntemine yapılan çağrıyı görebilirsiniz. Kaynak diziyi baştan kopyalıyoruz (0incikonum) ve tüm diziyi kopyalayın.
Son olarak, hem kaynağın hem de hedef dizilerin dize eşdeğerini görüntüleriz.
Dizicopy yöntemi ile, başlangıç ve bitiş öğesi konumlarını bağımsız değişken olarak alırken kısmi dizileri bile kopyalayabilirsiniz. Bu yöntem, dizi öğelerinin basit bir kopyasını oluşturur.
Arrays.copyOf () kullanma
Arrays.copyOf () yöntemi dahili olarak System.arraycopy () yöntemini kullanır. Dizikopi kadar verimli olmasa da, dizi kopyalama yöntemi gibi tam veya kısmi diziyi kopyalamak için kullanılabilir.
'CopyOf ()' yöntemi, java.util paketinin bir parçasıdır ve 'Arrays' sınıfına aittir.
Bu yöntemin prototipi aşağıdaki gibidir:
public static int() copyOf(int() original_array,int newLength)
Nerede,
- orijinal: Yeni diziye kopyalanacak dizi.
- newLength: Döndürülecek kopyalanan dizinin uzunluğu.
Bu nedenle, bu yöntem, uzunluğu 0 ile keserek veya yeni diziye doldurarak, ilk bağımsız değişkende sağlanan dizinin belirtilen uzunluğa bir kopyasını oluşturur. Bu, kopyalanan dizinin uzunluğu orijinal diziden daha fazlaysa, kalan öğeler için 0'lar değiştirilir.
Aşağıda verilen program copyOf yönteminin bir örneğini göstermektedir.
importjava.util.Arrays; public class Main { public static void main(String args()) { // define original array int() even_Array = new int() {2,4,6,8}; System.out.println('Original Array:' + Arrays.toString(even_Array)); // copying array even_Array to copy_Array int() copy_Array = Arrays.copyOf(even_Array,5); System.out.println('Copied Array:' + Arrays.toString(copy_Array)); // assign value to unassigned element of copied array copy_Array(4) = 10; System.out.println('Copied and modified Array:' + Arrays.toString(copy_Array)); } }
Çıktı:
Yukarıdaki programda, copyOf yöntemini kullanarak 4 çift_Array uzunluğunu kopyalıyoruz. Sağlanan ikinci argüman 5'tir. Dolayısıyla, yeni kopyalanan dizinin içinde 5 eleman vardır. İlk dördü orijinal diziyle aynıdır ve beşinci eleman copyOf'un onu doldurduğu gibi 0'dır, çünkü orijinal dizinin uzunluğu yeni dizininkinden daha azdır.
Arrays.copyOfRange () kullanma
Arrays.copyOfRange () yöntemi, özellikle kısmi dizileri kopyalamak istediğinizde kullanılır. CopyOf () yöntemi gibi, bu yöntem de dahili olarak System.arraycopy () yöntemini kullanır.
Arrays.copyOfRange () yönteminin prototipi aşağıdaki gibidir:
public static short() copyOfRange(short() original, int from, int to)
nerede,
- orijinal: Bir aralığın kopyalanacağı dizi.
- from: Kopyalanacak aralığın ilk dizini dahil.
- to: Hariç, kopyalanacak aralığın son dizini.
CopyOfRange yönteminin örnek bir uygulaması aşağıda gösterilmiştir.
import java.util.Arrays; class Main { public static void main(String args()) { int intArray() = { 10,20,30,40,50 }; // to index is within the range int() copyArray = Arrays.copyOfRange(intArray, 2, 6); System.out.println('Array copy with both index within the range: ' + Arrays.toString(copyArray)); //to index is out of range int() copy1 = Arrays.copyOfRange(intArray, 4, intArray.length + 3); System.out.println('Array copy with to index out of range: ' + Arrays.toString(copy1)); } }
Çıktı:
Object.clone () kullanma
Java dizisi dahili olarak bir Klonlanabilir arabirimi uygular ve bu nedenle bir Java dizisini klonlamak kolaydır. Tek boyutlu ve iki boyutlu dizileri klonlayabilirsiniz. Tek boyutlu diziyi klonladığınızda, değerleri kopyalayan dizi öğelerinin derin bir kopyasını oluşturur.
Öte yandan, iki boyutlu veya çok boyutlu dizileri klonladığınızda, öğelerin sığ bir kopyası yapılır, yani yalnızca referanslar kopyalanır. Dizilerin bu klonlanması, diziler tarafından sağlanan 'Clone ()' yöntemi ile yapılır.
Klonlamanın bir sonucu olarak 1-D dizilerinin derin bir kopyası aşağıdaki gibi temsil edilebilir:
Şimdi 1-D dizi klonlamasını bir Java programında uygulayalım.
class Main { public static void main(String args()) { int num_Array() = {5,10,15,20,25,30}; int clone_Array() = num_Array.clone(); System.out.println('Original num_Array:'); for (int i = 0; i Çıktıda görebileceğiniz gibi, her iki dizinin eşitliğini kontrol etmek için ifade yanlış döndürür. Bunun nedeni, tek boyutlu dizinin klonlanmasının, değerlerin yalnızca referanslar değil, yeni bir diziye kopyalandığı derin kopyayla sonuçlanmasıdır.
Sıkça Sorulan Sorular
S # 1) Java'da bir dizinin kopyası nasıl oluşturulur?
Cevap: Bir diziyi kopyalamak için farklı yöntemler vardır.
- Bir for döngüsü kullanabilir ve öğelerini birer birer diğerine kopyalayabilirsiniz.
- Bir diziyi klonlamak için klon yöntemini kullanın.
- System sınıfının arraycopy () yöntemini kullanın.
- Arrays sınıfının copyOf () veya copyOfRange () yöntemlerini kullanın.
S # 2) Bir diziyi diğerine nasıl atarsınız?
Cevap: Basit bir atama operatörü (=) kullanarak diziyi başka birine atayabilirsiniz. İki dizinin aynı veri türünde olduğundan ve aynı boyuta sahip olduğundan emin olmalısınız.
S # 3) Yüzeysel kopya ve Derin kopya nedir?
Cevap: Yüzeysel kopyada, yalnızca söz konusu nesnelerin veya dizilerin nitelikleri kopyalanır. Dolayısıyla, kopyalanan dizide yapılan herhangi bir değişiklik orijinal diziye yansıtılacaktır. Java klonlaması, yüzeysel bir kopya örneğidir.
qtp'de nesne deposu nedir
Derin bir kopya, nesnenin tam bir kopyasına ihtiyacımız olanıdır, böylece bu nesneyi klonladığımızda veya kopyaladığımızda bağımsız bir kopya olur. İlkel veya yerleşik türler söz konusu olduğunda, sığ ve derin kopya arasında hiçbir fark yoktur.
S # 4) Bir Dizi Klonu ne yapar?
Cevap: Dizilerin klonlama yöntemi, bir nesnenin niteliklerini diğerine kopyalamak için kullanılır. Bunu yapmak için sığ bir kopya kullanır.
S # 5) Bir Diziyi bir Dizide saklayabilir misiniz?
Cevap: Diziler, aynı türden (ilkel veya nesne) öğelerle sağlanan dizileri içerebilir. Bu, bir dize dizisinde bir tamsayı dizisi depolayamayacağınız anlamına gelir.
Sonuç
Bu eğitimde, Java'daki kopya dizisini ve dizileri klonlamayı araştırdık. Bir diziyi kopyalamak ve klonlamak için çeşitli yöntemler / yaklaşımlar gördük.
Bu yöntemlerin çoğunun basit bir kopya uyguladığını unutmayın. İlkel veri türleri için sığ ve derin kopya farklı değildir. Ancak bir dizi nesneler veya referanslar içerdiğinde, programcının gereksinimlere göre derin bir kopya uygulaması gerekir.
Sonraki eğitimlerimizde, Java dizileri hakkında daha fazlasını keşfetmeye devam ediyoruz.
=> Kolay Java Eğitim Serisini Okuyun.
Önerilen Kaynaklar
- Kod Örnekleriyle Java Dizi Uzunluğu Eğitimi
- Java Generic Array - Java'da Genel Diziler Nasıl Simüle Edilir?
- Java Dizisi - Java'da Bir Dizinin Elemanları Nasıl Yazdırılır?
- Java'da Çok Boyutlu Diziler (Java'da 2d ve 3B Diziler)
- Java'da Dizi Nasıl Geçilir / Döndürülür
- Java'da Bir Dizi Nasıl Sıralanır - Örneklerle Eğitim
- Java Dizisi - Java'da Bir Dizi Bildirin, Oluşturun ve Başlatın
- Java'da Bir Diziden Bir Öğeyi Kaldırma / Silme