java copy array how copy clone an array java
Tento kurz kopírování a klonování polí pojednává o různých metodách kopírování pole v Javě:
Zde probereme operaci kopírování polí Java. Java poskytuje různé způsoby, jak můžete vytvářet kopie prvků pole. Jak víme, v Javě mohou pole obsahovat prvky primitivních typů nebo objekty nebo odkazy.
Při vytváření kopií primitivních typů je úkol poměrně snadný, ale pokud jde o objekty nebo odkazy, musíte věnovat pozornost tomu, zda je kopie hluboká nebo mělká.
=> Prohlédněte si příručku Java Beginners Guide zde.
Mělká kopie vytvoří kopii prvku. Není problém, když se jedná o primitivní datové typy. Ale pokud jsou zahrnuty odkazy, mělká kopie zkopíruje pouze hodnotu a nikoli základní informace.
I když jste tedy vytvořili kopie prvků, změna v jedné kopii se tedy projeví i v jiné kopii, protože jsou sdílena paměťová místa. Chcete-li tomu zabránit, musíte přejít na hlubokou kopii, ve které nejsou sdílena paměťová místa.
Co se naučíte:
Kopírování a klonování polí Java
Java umožňuje kopírovat pole buď metodou přímého kopírování poskytovanou java.util nebo třídou System. Poskytuje také metodu klonování, která se používá ke klonování celého pole.
V tomto kurzu probereme následující metody kopírování a klonování polí.
- Ruční kopírování pomocí smyčky for
- Použití System.arraycopy ()
- Používání Arrays.copyOf ()
- Používání Arrays.copyOfRange ()
- Použití Object.clone ()
Pojďme prozkoumat !!
Ruční kopírování pomocí smyčky
Normálně, když kopírujeme proměnné, například aab, provedeme operaci kopírování následujícím způsobem:
a = b;
Pokud použijeme stejnou metodu na pole, nebude to fungovat správně.
Podívejme se na příklad programování.
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 Výstup:

Ve výše uvedeném programu existují dvě pole, tj. IntArray a copyArray. Úkolem je zkopírovat obsah intArray do copyArray. K tomu je zaveden příkaz copyArray = intArray. Zde se provádí přiřazení odkazů na pole. Toto tedy není skutečné kopírování.
V důsledku výše uvedeného příkazu je umístění paměti intArray sdíleno také copyArray. Nyní, když je prvek copyArray zvýšen, se tato změna projeví také v intArray. To se zobrazuje na výstupu.
K překonání tohoto problému používáme metodu kopírování pole pomocí smyčky for. Zde je každý prvek původního pole zkopírován do nového pole pomocí smyčky for.
Tento program je uveden níže.
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 Výstup:

Zde jsme upravili předchozí program tak, aby zahrnoval smyčku for a inside for, každému prvku intArray přiřadíme odpovídající prvek copyArray. Tímto způsobem jsou prvky skutečně zkopírovány. Když je tedy jedno pole změněno, změny se neprojeví v jiném poli.
Použití System.arraycopy ()
Třída systému Java má metodu nazvanou „ArrayCOpy“, která umožňuje kopírovat prvky jednoho pole do jiného pole.
Obecný prototyp této metody je následující:
public static void arraycopy( Object src_array, int src_Pos,Object dest_array, int dest_Pos, int length )
Tady,
- src_array => Zdrojové pole, odkud má být obsah kopírován.
- src_Pos => Pozice ve zdrojovém poli, odkud začne kopírování.
- dest_array => Cílové pole, do kterého se mají kopírovat prvky.
- dest_Pos => Výchozí pozice v cílovém poli pro kopírované prvky.
- délka => Délka pole ke kopírování.
Pochopme tuto metodu na příkladu.
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)); } }
Výstup:

Ve výše uvedeném programu používáme ke kopírování pole do jiného pole metodu ‚arraycopy '. Můžete vidět volání metody arraycopy. Zkopírujeme zdrojové pole od začátku (0thumístění) a zkopírujte celé pole.
Nakonec zobrazíme řetězcový ekvivalent zdrojového i cílového pole.
Pomocí metody arraycopy můžete kopírovat i částečná pole, protože jako argumenty se berou pozice počátečního a koncového prvku. Tato metoda vytváří mělkou kopii prvků pole.
Používání Arrays.copyOf ()
Metoda Arrays.copyOf () interně využívá metodu System.arraycopy (). Ačkoli to není tak efektivní jako arraycopy, lze jej použít ke kopírování celého nebo částečného pole, stejně jako metoda arraycopy.
Metoda „copyOf ()“ je součástí balíčku java.util a patří do třídy „Arrays“.
Prototyp této metody je následující:
public static int() copyOf(int() original_array,int newLength)
Kde,
- originál: Pole, které se má zkopírovat do nového pole.
- novýDélka: Délka zkopírovaného pole, která se má vrátit.
Tato metoda tedy vytvoří kopii pole poskytnutého v prvním argumentu na zadanou délku zkrácením nebo polstrováním délky 0 do nového pole. To znamená, že pokud je délka kopírovaného pole větší než původní pole, u zbývajících prvků se nahradí 0s.
Níže uvedený program ukazuje příklad metody copyOf.
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)); } }
Výstup:

Ve výše uvedeném programu kopírujeme even_Array o délce 4 pomocí metody copyOf. Druhý poskytnutý argument je 5. Nové zkopírované pole má tedy 5 prvků. První čtyři jsou stejné jako původní pole a pátý prvek je 0, protože copyOf jej vyplňuje, protože délka původního pole je menší než délka nového pole.
Používání Arrays.copyOfRange ()
Metoda Arrays.copyOfRange () se konkrétně používá, když chcete kopírovat částečná pole. Stejně jako metoda copyOf () i tato metoda interně využívá metodu System.arraycopy ().
Prototyp metody Arrays.copyOfRange () je následující:
public static short() copyOfRange(short() original, int from, int to)
kde,
- originál: Pole, ze kterého se má zkopírovat rozsah.
- z: Počáteční index rozsahu, který má být kopírován, včetně.
- na: Konečný index rozsahu, který se má zkopírovat, exkluzivní.
Příklad implementace metody copyOfRange je uveden níže.
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)); } }
Výstup:

Použití Object.clone ()
Pole Java interně implementuje Cloneable rozhraní a je tedy snadné klonovat pole Java. Můžete klonovat jednorozměrná i dvourozměrná pole. Když klonujete jednorozměrné pole, vytvoří se hluboká kopie prvků pole, která kopíruje hodnoty.
Na druhou stranu, když naklonujete dvourozměrná nebo vícerozměrná pole, vytvoří se mělká kopie prvků, tj. Zkopírují se pouze odkazy. Toto klonování polí se provádí metodou „Clone ()“, kterou poskytují pole.
Hluboká kopie 1-D polí v důsledku klonování může být znázorněna níže:

Nyní provedeme klonování 1-D pole v programu Java.
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 Jak vidíte na výstupu, výraz ke kontrole rovnosti obou polí vrátí hodnotu false. Důvodem je, že klonování jednorozměrného pole vede k hlubokému kopírování, při kterém jsou hodnoty zkopírovány do nového pole a ne pouze na odkazy.
Často kladené otázky
Otázka č. 1) Jak vytvořit kopii pole v Javě?
Odpovědět: Existují různé metody kopírování pole.
- Můžete použít smyčku for a kopírovat prvky jednoho do druhého jeden po druhém.
- Klonujte pole pomocí metody klonování.
- Použijte metodu arraycopy () třídy System.
- Použijte metody copyOf () nebo copyOfRange () třídy Arrays.
Otázka 2) Jak přiřadíte jedno pole k jinému?
Odpovědět: Pole můžete přiřadit jinému pomocí jednoduchého operátoru přiřazení (=). Musíte zajistit, aby obě pole byla stejného datového typu a měla identickou dimenzi.
Otázka č. 3) Co je mělká kopie a hluboká kopie?
Odpovědět: V mělké kopii jsou kopírovány pouze atributy dotyčných objektů nebo polí. Jakékoli změny kopírovaného pole se tedy projeví v originálu. Klonování Java je příkladem mělké kopie.
jak přidat do řetězcového pole
Hluboká kopie je ta, kde potřebujeme úplnou kopii objektu, takže když tento objekt naklonujeme nebo zkopírujeme, bude to nezávislá kopie. Pokud jde o primitivní nebo vestavěné typy, není rozdíl mezi mělkou a hlubokou kopií.
Otázka č. 4) Co dělá Array Clone?
Odpovědět: Metoda klonování polí se používá ke kopírování atributů jednoho objektu do druhého. K tomu používá mělkou kopii.
Otázka č. 5) Můžete uložit pole do pole?
Odpovědět: Pole mohou obsahovat pole poskytovaná s prvky stejného typu (primitivní nebo objekt). To znamená, že nemůžete uložit celé číslo do pole řetězce.
Závěr
V tomto tutoriálu jsme prozkoumali pole kopií a klonování v Javě. Viděli jsme různé metody / přístupy ke kopírování a klonování pole.
Všimněte si, že většina z těchto metod implementuje mělkou kopii. U primitivních datových typů se mělké a hluboké kopírování neliší. Ale když pole obsahuje objekty nebo odkazy, programátor musí implementovat hlubokou kopii podle požadavků.
V našich následujících výukových programech pokračujeme v prozkoumávání dalších informací o polích Java.
=> Přečtěte si řadu Easy Java Training Series.
Doporučené čtení
- Výukový program Java Array Length s příklady kódu
- Generické pole Java - Jak simulovat obecná pole v Javě?
- Java Array - Jak tisknout prvky pole v Javě?
- Vícedimenzionální pole v Javě (2D a 3D pole v Javě)
- Jak předat / vrátit pole v Javě
- Jak řadit pole v Javě - návod s příklady
- Java Array - deklarovat, vytvořit a inicializovat pole v Javě
- Odebrat / Odstranit prvek z pole v Javě