一维整型数组的定义:
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转载的图: