將一個陣列複製到另一個陣列上

liszlove發表於2020-10-18

複製陣列

這是我做leetbook陣列題的第一題時遇到的疑問,決定分兩個情況考慮。

1、陣列長度相等

假設nums和nums1是長度相等的兩個陣列。

1.1、用nums = nums1;

賦值前在這裡插入圖片描述


賦值後在這裡插入圖片描述
nums建立的時候在堆裡面建立一塊記憶體區域用來儲存,nums指向這個記憶體地址A。
nums1建立後指向B。
現在令nums = nums1;則把num1的地址(或者說是引用)賦給了num,所以num也指向了B。
兩個陣列都指向堆中同一個記憶體區域,他們是共享裡面的資料。

1.2、for迴圈

        for (int i = 0; i < nums1.length; i++){
            nums[i] = nums1[i];
        }

迴圈前:在這裡插入圖片描述


迴圈後:
在這裡插入圖片描述
成功改變nums陣列內部內容,而沒有改變其引用。

1.3、Arrays類

方法1:複製指定陣列至指定長度

nums = Arrays.copyOf(nums1,5);

方法2:複製指定陣列的指定長度

nums = Arrays.copyOfRange(nums1,0,5);

兩種方法最後的索引都可以>陣列的長度,然後後面的都會補上0。
兩種方法都可以成功複製陣列,而且我們發現原陣列nums從524變成了526,說明這兩種複製方法是建立了一個新陣列,然後用等號左邊的陣列指向這個新陣列。

在這裡插入圖片描述

1.4、System.arraycopy方法

System.arraycopy(originalArray, 0, targetArray, 0, originalArray.length);

在這裡插入圖片描述
可以看出這個方法類似於我們的for迴圈,是直接改原來陣列的內容,沒有改引用。

2、陣列長度不等

  1. 賦值法成功
  2. for迴圈要注意越界問題,會報java.lang.ArrayIndexOutOfBoundsException
  3. Arrays類法成功
  4. 注意越界問題,會報java.lang.ArrayIndexOutOfBoundsException

相關文章