天天看点

数组一维整型数组的定义:一维整型数组遍历:一维数组拷贝方式:二维数组定义:二维数组的遍历:二维数组的拷贝:拷贝方式的浅、深分析:

一维整型数组的定义:

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转载的图:

浅拷贝:

数组一维整型数组的定义:一维整型数组遍历:一维数组拷贝方式:二维数组定义:二维数组的遍历:二维数组的拷贝:拷贝方式的浅、深分析:

深拷贝:

数组一维整型数组的定义:一维整型数组遍历:一维数组拷贝方式:二维数组定义:二维数组的遍历:二维数组的拷贝:拷贝方式的浅、深分析:

继续阅读