在 Java 中複製二維陣列
Waleed
2023年1月30日
2022年4月26日
每當我們嘗試將二維陣列的元素複製到另一個陣列時,我們通常會將一個原始陣列分配給目標陣列。為什麼這種方法在邏輯上是錯誤的,我們將首先討論它。
儘管下面提到的解決方案在邏輯上是錯誤的,但我們想讓你知道為什麼這個解決方案不起作用。
// Java Program to copy 2-dimensional array
// create 2D array
int [ ][ ] arr1 = { {2,4,6}, {8,10,12} };
// creating the same array with the same size
int [ ] [ ] arr2 = new int[arr1.length];
// this code does not copy elements of arr1[ ] to arr2[ ] because arr2[ ] sill refer to the same location
arr2 = arr1;
當我們寫 arr2=arr1
時,我們正在分配 arr2[ ]
對 arr1[ ]
的引用。因此,更改一個陣列將同時反映在複製的陣列和原始陣列中,因為兩個陣列都指向同一個位置。
為了證明這一事實,請檢視下面描述的程式碼。
// A Java program to demonstrate assigning an array reference doesn't make any sense
public class copy2DArray{
public static void main(String []args){
// Create an array arr1[]
int [][] arr1 = { {2,4,5}, {6,8,10} };
// Create an array arr2[] with the same size
int [][] arr2 = new int[arr1.length][];
// Doesn't copy elements of arr1 to arr2, but only arr2 starts refering arr1
arr2 = arr1;
// Any changing in the arr2 also reflects in the arr1 because
// both are referin to the same location
arr2 [0][0] = 88;
System.out.println("Elements of arr1[] are:");
for (int i=0; i<arr1.length; i++){
for (int j=0; j<arr1.length; j++){
System.out.println(arr1[i][j] + " ");
}
}
System.out.println("\n\nElements of arr2[] are:");
for (int i=0; i<arr2.length; i++){
for (int j=0; j<arr2.length; j++){
System.out.println(arr2[i][j] + " ");
}
}
}
}
輸出:
Elements of arr1[] are:
88
4
6
8
Elements of arr2[] are:
88
4
6
8
在上面的示例中,我們討論了開發人員在複製二維陣列元素時經常犯的常見錯誤。現在我們將討論完成相同任務的正確方法。
在 Java 中,我們可以使用以下方法複製陣列元素:
- 迭代陣列的所有元素並複製每個元素。
- 通過使用
clone()
方法。 - 通過使用
arraycopy()
方法。
在 Java 中使用迴圈迭代複製二維陣列
用於複製二維陣列的迴圈迭代技術。使用此方法,你將體驗到任何目標或原始陣列修改都不會影響原始陣列。因此,原始陣列保持不變。
// A Java program to demonstrate assigning an array reference doesn't make any sense
import java.util.Arrays;
public class copy2DArray{
public static void main(String [ ]args){
// Create an array arr1[ ]
int [ ][ ] arr1 = { {2,4,5}, {6,8,10} };
// Create an array arr2[ ] with the same size
int [ ][ ] arr2 = new int[arr1.length][ ];
// Copying elements of arr1[ ] to arr2[ ]
for(int i = 0; i < arr1.length; i++){
// allocation space to each row of arr2[]
arr2[i] = new int[arr1[i].length];
for(int j= 0; j<arr1[i].length; j++){
arr2[i][j] = arr1[i][j];
}
}
// Any change in the elements of arr2[ ] will not be reflected in an original array
arr2[0][0] = 90;
System.out.println("Elements of arr1[] are:");
for (int i=0; i < arr1.length; i++){
for (int j=0; j < arr1[0].length; j++){
System.out.println(arr1[i][j] + " ");
}
}
System.out.println("\n\nElements of arr2[] are:");
for (int i=0; i < arr2.length; i++){
for (int j=0; j < arr2[0].length; j++){
System.out.println(arr2[i][j] + " ");
}
}
}
}
輸出:
Elements of arr1[] are:
2
4
5
6
8
10
Elements of arr2[] are:
90
4
5
6
8
10
在 Java 中使用 clone()
方法複製二維陣列
在之前的方法中,我們使用迴圈迭代技術來複制二維陣列元素。我們可以使用 clone()
方法完成相同的任務。
// A Java program to demonstrate assigning an array reference doesn't make any sense
import java.util.Arrays;
public class copy2DArray{
public static void main(String []args){
// Create an array arr1[]
int [ ][ ] arr1 = { {2,4,5}, {6,8,10} };
// Create an array arr2[] with the same size
int [ ][ ] arr2 = new int[arr1.length][];
// Copying elements of arr1[ ] to arr2[ ] using the clone() method
for(int i = 0; i < arr1.length; i++)
arr2[i] = arr1[i].clone();
// Any change in the elements of arr2[] will not be reflected in an original array
arr2[0][0] = 90;
System.out.println("Elements of arr1[] are:");
for (int i=0; i < arr1.length; i++){
for (int j=0; j < arr1[0].length; j++){
System.out.println(arr1[i][j] + " ");
}
}
System.out.println("\n\nElements of arr2[] are:");
for (int i=0; i < arr2.length; i++){
for (int j=0; j < arr2[0].length; j++){
System.out.println(arr2[i][j] + " ");
}
}
}
}
輸出:
Elements of arr1[] are:
2
4
5
6
8
10
Elements of arr2[] are:
90
4
5
6
8
10
在 Java 中使用 arraycopy()
方法複製二維陣列
同樣,我們可以使用 arraycopy()
方法複製二維陣列。我們可以複製任何二維陣列的元素,而無需使用此方法迭代所有陣列元素。要使用此方法,我們需要提供以下引數:
src
:你需要複製的源陣列srcPos
:原始陣列的起始位置。dest
:目標陣列。destPos
:目標陣列的起始索引。length
:我們要複製的二維陣列元素的總數
例外:
NullPointerException
:如果源或目標陣列未定義或不存在。ArrayStoreException
:如果開發人員試圖將整數陣列型別複製到字串陣列中,這種情況會自動觸發此異常。
例子:
package sampleProject;
import java.util.Arrays;
public class Codesample {
public static void main(String []args){
// Create an array arr1[]
int [][] arr1 = { {2,4,5}, {6,8,10} };
// Create an array arr2[] with the same size
int [][] arr2 = new int[arr1.length][];
// Copying elements of arr1[] to arr2[] using the clone() method
for(int i = 0; i < arr1.length; i++) {
arr2[i] = new int[arr1[i].length];
System.arraycopy(arr1[i], 0, arr2[i], 0, arr1[i].length);
}
// Any change in the elements of arr2[] will not be reflected in an original array
arr2[0][0] = 90;
System.out.println("Elements of arr1[] are:");
for (int i=0; i < arr1.length; i++){
for (int j=0; j < arr1[0].length; j++){
System.out.println(arr1[i][j] + " ");
}
}
System.out.println("\n\nElements of arr2[] are:");
for (int i=0; i < arr2.length; i++){
for (int j=0; j < arr2[0].length; j++){
System.out.println(arr2[i][j] + " ");
}
}
}
}
輸出:
Elements of arr1[] are:
2
4
5
6
8
10
Elements of arr2[] are:
90
4
5
6
8
10