天天看點

數組一維整型數組的定義:一維整型數組周遊:一維數組拷貝方式:二維數組定義:二維數組的周遊:二維數組的拷貝:拷貝方式的淺、深分析:

一維整型數組的定義:

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轉載的圖:

淺拷貝:

數組一維整型數組的定義:一維整型數組周遊:一維數組拷貝方式:二維數組定義:二維數組的周遊:二維數組的拷貝:拷貝方式的淺、深分析:

深拷貝:

數組一維整型數組的定義:一維整型數組周遊:一維數組拷貝方式:二維數組定義:二維數組的周遊:二維數組的拷貝:拷貝方式的淺、深分析:

繼續閱讀