一維整型數組的定義:
int []a={1,2,3}; //系統為我們指定數組長度
int []a= new int [10] //記憶體存儲機關位元組
int []a=new int[] {1,2,3} //系統為我們指定數組長度
///new的對象是在堆裡建立空間
一維整型數組周遊:
1、for(int i=0,i<a.length,i++){
a[i];
}
2、Arrays.toString(); //System.out.println(Arrays.toString(brr))
3、 for(int a :arr) {
System.out.println(i);
} //每次周遊arr中元素給a
一維數組拷貝方式:
1、利用for循環
for(int i=0,i<arr.length,i++){
brr[i]=arr[i];
}
2、Arrays.copyOf (重新申請了一塊大的記憶體空間 ,得用新的對位址進行(傳回值)進行接受)
例子:
arr=Arrays.copyOf(arr,5); //對數組arr擴容,空間為5
System.out.println(Arrays.toString(arr)); //把arr數組的每個數周遊,列印出來
3、System.arraycopy(arr,角标,brr,角标,arr.length)
// 原數組;從中繼資料的起始位置開始;目标數組;目标數組的開始起始位置 ;要copy的數組的長度
4、arr.clone()
int [] arr = {7, 8, 9};
int [] brr = arr.clone(); //調用數組的clone()方法,将數組複制一份,并讓brr指向複制出來的數組。
5、 brr=arr; //直接拷貝,隻是傳遞位址,屬于淺拷貝。
二維數組定義:
1、int[][]arr=new int [3][3]
int[][]arr=new int[][] {1,2,3,4} //錯誤的,不知道幾行幾列
int[][]arr=new int{{1,2},{3,4}};
2、//定義三行三列
int[][]arr=new int[3][];
arr[0]=new int[3];
arr[1]=new int[3];
arr[2]=new int[3];
3、Java交錯數組:
Int[][]arr=new int[3][];
arr[0]=new int[5]; 第一行5個元素
arr[1]=new int[3]; 第二行3個元素
arr[2]=new int[2]; 第三行2個元素
二維數組的周遊:
//第一種方法
for(int i =0;i <arr.length;i++){
for(int j=0;j<arr[j];j++)
{
System.out.println(arr[i][j]);
}
}
//第二種方法
Arrays.deepToString(arr)
//第三種方法
for(int [] brr : arr){
for(int a :brr)
{ a;
}
}
二維數組的拷貝:
//第一種方法
int[][]brr=new int [a][b]
System.arraycopy(arr,0,brr,0,arr.length)
//第二種
Arrays.copyof(arr,arr.length)
//第三種
for(int i=0;i<arr[i].length;i++){ //實作深拷貝
brr[i]=arr[i].clone();
}
//第四種
brr=arr; //直接拷貝,隻是傳遞位址,屬于淺拷貝。
拷貝方式的淺、深分析:
一維數組:
public static void main (String []args) {
//一維數組定義
int[] arr = {1, 2, 3};
//一維數組的拷貝方式的判斷
System.out.println("//第一種 直接拷貝;淺拷貝");
int[] arr1 = arr;
arr1[0] = 10;
System.out.println(arr);
System.out.println(arr1);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr1));
System.out.println("//第二種 ***Arrays.copyOf:深拷貝***");
int [] arr2=Arrays.copyOf(arr,arr.length);
arr2[0] = 9;
System.out.println(arr);
System.out.println(arr2);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr2));
System.out.println("//第三種 ***System.arraycopy:深拷貝***");
int []arr3=new int[5];
System.arraycopy(arr,0,arr3,0,arr.length);
arr3[0] = 8;
System.out.println(arr);
System.out.println(arr3);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr3));
//第四種
System.out.println("//第四種 ***clone():深拷貝***");
int []arr4=new int[5];
arr4=arr.clone();
arr4[0] = 7;
System.out.println(arr);
System.out.println(arr4);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr4));
//第五種
System.out.println("//第五種 ***for:深拷貝***");
int []arr5=new int[5];
for(int i=0;i<arr.length;i++){
arr5[i]=arr[i];
}
arr5[0] = 6;
System.out.println(arr);
System.out.println(arr5);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr5));
}
輸出結果:
//第一種 直接拷貝;淺拷貝
[[email protected]
[[email protected]
[10, 2, 3]
[10, 2, 3]
//第二種 ***Arrays.copyOf:深拷貝***
[[email protected]
[[email protected]
[10, 2, 3]
[9, 2, 3]
//第三種 ***System.arraycopy:深拷貝***
[[email protected]
[[email protected]
[10, 2, 3]
[8, 2, 3, 0, 0]
//第四種 ***clone():深拷貝***
[[email protected]
[[email protected]
[10, 2, 3]
[7, 2, 3]
//第五種 ***for:深拷貝***
[[email protected]
[[email protected]
[10, 2, 3]
[6, 2, 3, 0, 0]
可以得到;
一維數組除了brr=arr以外,都為深拷貝。
二維數組:
public static void main (String []args) {
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
// int[][] brr = new int[2][3];
// int[][] crr = new int[2][];
// crr[0] = new int[]{7,8,9};
// crr[1] = new int[3];
System.out.println("第一種拷貝方式;直接拷貝");
int [][]arr1=new int [2][3];
arr1=arr;
arr1[0][0]=10;
System.out.println(arr);
System.out.println(Arrays.deepToString(arr));
System.out.println(arr1);
System.out.println(Arrays.deepToString(arr1));
System.out.println("第二種拷貝方式;Arrays.copyOf拷貝");
int [][]arr2=new int [2][3];
///淺拷貝*************
//arr2=Arrays.copyOf(arr,arr.length);
///深拷貝*************
for(int i=0;i<arr.length;i++){
arr2[i]=Arrays.copyOf(arr[i],arr[i].length);
}
//
arr2[0][0]=9;
System.out.println(arr);
System.out.println(Arrays.deepToString(arr));
System.out.println(arr2);
System.out.println(Arrays.deepToString(arr2));
System.out.println("第三種拷貝方式;System.arraycopy拷貝");
int [][]arr3=new int [2][3];
//深拷貝
for(int i=0;i<arr.length;i++){
System.arraycopy(arr[i],0,arr3[i],0,arr[i].length);
}
//淺拷貝
// System.arraycopy(arr,0,arr3,0,arr.length);
arr3[0][0]=8;
System.out.println(arr);
System.out.println(Arrays.deepToString(arr));
System.out.println(arr3);
System.out.println(Arrays.deepToString(arr3));
System.out.println("第四種拷貝方式;for元素拷貝");
int [][]arr4=new int [2][3];
for(int i=0;i<arr.length;i++){
for (int j=0;j<arr[i].length;j++){
//arr4[i]=arr[i]; //引用拷貝為淺拷貝。
arr4[i][j]=arr[i][j]; //一個一個元素拷貝的,為深拷貝。
}
}
arr4[0][0]=7;
System.out.println(arr);
System.out.println(Arrays.deepToString(arr));
System.out.println(arr4);
System.out.println(Arrays.deepToString(arr4));
System.out.println("第五種拷貝方式;clone()拷貝");
int [][]arr5=new int [2][3];
//深拷貝
for(int i=0;i<arr.length;i++){
arr5[i]=arr[i].clone();
}
//淺拷貝
//arr5=arr.clone();
arr5[0][0]=6;
System.out.println(arr);
System.out.println(Arrays.deepToString(arr));
System.out.println(arr5);
System.out.println(Arrays.deepToString(arr5));
}
輸出結果:
第一種拷貝方式;直接拷貝
[[[email protected]
[[10, 2, 3], [4, 5, 6]]
[[[email protected]
[[10, 2, 3], [4, 5, 6]]
第二種拷貝方式;Arrays.copyOf拷貝
[[[email protected]
[[10, 2, 3], [4, 5, 6]]
[[[email protected]
[[9, 2, 3], [4, 5, 6]]
第三種拷貝方式;System.arraycopy拷貝
[[[email protected]
[[10, 2, 3], [4, 5, 6]]
[[[email protected]
[[8, 2, 3], [4, 5, 6]]
第四種拷貝方式;for元素拷貝
[[[email protected]
[[10, 2, 3], [4, 5, 6]]
[[[email protected]
[[7, 2, 3], [4, 5, 6]]
第五種拷貝方式;clone()拷貝
[[[email protected]
[[10, 2, 3], [4, 5, 6]]
[[[email protected]
[[6, 2, 3], [4, 5, 6]]
除了直接拷貝的是前拷貝,我把其餘方式都弄成了深拷貝。
被我用 // 注釋掉的為淺拷貝的代碼。
對于二維數組:
https://blog.csdn.net/qq_37232304/article/details/79950022轉載的圖: