English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本教程中,您将在示例的帮助下了解可用于在Java中复制数组(一维和二维)的不同方法。
在Java中,我们可以将一个数组复制到另一个数组中。有几种技术可以用来在Java中复制数组。
让我们举个实例
class Main { public static void main(String[] args) { int [] numbers = {1, 2, 3, 4, 5, 6}; int [] positiveNumbers = numbers; //复制数组 for (int number : positiveNumbers) { System.out.print(number + ", "); } } }
Ausgabe:
1, 2, 3, 4, 5, 6
在上面的示例中,我们使用赋值运算符(=)将一个名为numbers的数组复制到另一个名为positiveNumbers的数组中。
这种技术是最简单的一种,它同样有效。然而,这种技术有一个问题。如果我们改变一个数组的元素,其他数组的相应元素也会改变。例如,
class Main { public static void main(String[] args) { int [] numbers = {1, 2, 3, 4, 5, 6}; int [] positiveNumbers = numbers; //复制数组 //更改第一个数组的值 numbers[0] = -1; //打印第二个数组 for (int number : positiveNumbers) { System.out.print(number + ", "); } } }
Ausgabe:
-1, 2, 3, 4, 5, 6
在这里,我们可以看到我们已经改变了numbers数组的一个值。当我们打印positiveNumbers数组时,可以看到相同的值也发生了更改。
这是因为两个数组都引用相同的数组对象。这是因为浅拷贝。要了解有关浅拷贝的更多信息,请访问浅拷贝。
现在,要在复制数组的同时生成新的数组对象,我们需要深度复制而不是浅拷贝。
Lassen Sie uns ein Beispiel nennen:
import java.util.Arrays; class Main { public static void main(String[] args) { int [] source = {1, 2, 3, 4, 5, 6}; int [] destination = new int[6]; //迭代并将元素从源复制到目标 for (int i = 0; i < source.length; ++i) { destination[i] = source[i]; } //Array in einen String umwandeln System.out.println(Arrays.toString(destination)); } }
Ausgabe:
[1, 2, 3, 4, 5, 6]
Im obigen Beispiel haben wir den for-Loop verwendet, um jeden Element des Source-Arrays zu durchlaufen. Bei jeder Iteration kopieren wir das Element vom Source-Array in das Ziel-Array.
Hier verweisen die Quell- und Zielarrays auf unterschiedliche Objekte (tiefes Kopieren). Daher bleibt der entsprechende Element der anderen Array unverändert, wenn ein Element eines Arrays geändert wird.
Beachten Sie die folgenden Anweisungen,
System.out.println(Arrays.toString(destination));
Hier wird die Methode toString() verwendet, um das Array in einen String umzuwandeln.
In Java,System-KlasseDas Paket enthält eine Methode namens arraycopy() zum Kopieren von Arrays. Im Vergleich zu den beiden oben genannten Methoden ist dies eine bessere Methode zum Kopieren von Arrays.
Methode ermöglicht es Ihnen, einen bestimmten Teil des Source-Arrays in das Zielarray zu kopieren. Zum Beispiel,
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Hier,
src -Das Sourcearray, das Sie kopieren möchten
srcPos -Startposition im Sourcearray (Index)
dest -Zielarray, das aus dem Source kopiert werden soll
destPos -Startposition im Zielarray (Index)
length -Anzahl der zu kopierenden Elemente
Lassen Sie uns ein Beispiel nennen:
//Verwenden Sie die Methode Arrays.toString() import java.util.Arrays; class Main { public static void main(String[] args) { int[] n1 = {2, 3, 12, 4, 12, -2}; int[] n3 = new int[5]; //eine Länge von n1von der Länge n2Array int[] n2 = new int[n1.length]; //Kopieren des gesamten n1Array kopieren nach n2 System.arraycopy(n1, 0, n2, 0, n1.length); System.out.println("n2 = " + Arrays.toString(n2)); //von n1Arrayindex2Kopieren von Elementen //Elemente kopieren in n3Arrayindex1 //Kopieren2Elemente System.arraycopy(n1, 2, n3, 1, 2); System.out.println("n3 = " + Arrays.toString(n3)); } }
Ausgabe:
n2 = [2, 3, 12, 4, 12, -2] n3 = [0, 12, 4, 0, 0]
In dem obigen Beispiel haben wir die Methode arraycopy() verwendet,
System.arraycopy(n1, 0, n2, 0, n1.length) - Kopieren Sie n1Der gesamte Element des Arrays wird kopiert nach n2im Array
System.arraycopy(n1, 2, n3, 1, 2 )- 从索引2beginnend bei n1Zwei Elemente des Arrays werden kopiert in die Position von n3Array1der Startindex
Wie Sie sehen können, hat der int-Typ-Arrayelement die Standard-Initialwert 0.
Wir können auchJava ArraysIn der im Klassendiagramm definierten copyOfRange() Methode, um Arrays zu kopieren. Zum Beispiel,
//Verwenden Sie toString() und copyOfRange() Methoden import java.util.Arrays; class ArraysCopy { public static void main(String[] args) { int[] source = {2, 3, 12, 4, 12, -2}; //将整个源数组复制到目标 int[] destination1 = Arrays.copyOfRange(source, 0, source.length); System.out.println("destination1 = " + Arrays.toString(destination1)); //从索引2复制到5(不包括5) int[] destination2 = Arrays.copyOfRange(source, 2, 5); System.out.println("destination2 = " + Arrays.toString(destination2)); } }
Ausgaberesultat
destination1 = [2, 3, 12, 4, 12, -2] destination2 = [12, 4, 12]
Beachten Sie im obigen Beispiel die folgenden Zeilen:
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
Hier können wir sehen, dass wir destination erstellen1Arrays并同时将源数组复制到它。在调用copyOfRange()方法之前,我们不会创建destination1Weitere Informationen zu dieser Methode finden Sie unterJava copyOfRange。
Wie bei eindimensionalen Arrays können wir auch for-Schleifen verwenden, um zweidimensionale Arrays zu kopieren. Zum Beispiel,
import java.util.Arrays; class Main { public static void main(String[] args) { int[][] source = {"}} {1, 2, 3, 4}, {5, 6}, {0, 2, 42, -4, 5} }; int[][] destination = new int[source.length][]; for (int i = 0; i < destination.length; ++i) { //Raum für jede Zeile des Zielarrays zuweisen destination[i] = new int[source[i].length]; for (int j = 0; j < destination[i].length; ++j) { destination[i][j] = source[i][j]; } } //Zielarray anzeigen System.out.println(Arrays.deepToString(destination)); } }
Ausgabe:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
Beachten Sie im obigen Programm die folgenden Zeilen:
System.out.println(Arrays.deepToString(destination);
Hier wird die Methode deepToString() verwendet, um eine bessere Darstellung zweidimensionaler Arrays zu bieten. Weitere Informationen finden Sie unterJava deepToString()。
Um den obigen Code einfacher zu gestalten, können wir System.arraycopy() anstelle des inneren Loops verwenden, so wie man es bei eindimensionalen Arrays tut. Zum Beispiel, zum Beispiel,
import java.util.Arrays; class Main { public static void main(String[] args) { int[][] source = {"}} {1, 2, 3, 4}, {5, 6}, {0, 2, 42, -4, 5} }; int[][] destination = new int[source.length][]; for (int i = 0; i<source.length; ++i) { //Raum für jede Zeile des Zielarrays zuweisen destination[i] = new int[source[i].length]; System.arraycopy(source[i], 0, destination[i], 0, destination[i].length); } //Zielarray anzeigen System.out.println(Arrays.deepToString(destination)); } }
Ausgabe:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
Hier können wir sehen, dass wir die gleiche Ausgabe erhalten, indem wir den internen for-Loop durch das arraycopy()-Verfahren ersetzen.