1. 程式人生 > >陣列拷貝的五種方法

陣列拷貝的五種方法

對一維陣列而言,僅不開闢空間的直接賦值為淺拷貝(brr=arr)

陣列拷貝有5種方法
1.for
2.System.arraycopy(src,srcpos,dest,destpos,length)
3.Arrays.copyof( original, newlength)
4.clone()
5.Arrays.copyOfRange(original,from,to)

1.for迴圈遍歷陣列對元素一一進行賦值操作(對於多維陣列來說是淺拷貝)
2.呼叫 System.arraycopy(src,srcpos,dest,destpos,length)//必須保證dest有足夠容量;

int[] arr = {1,2,3,4,5,6};
int[] brr = new int[arr.length];
System.arraycopy(arr,1,brr,0,5);
System.out.println(Arrays.toString(brr));   //[2, 3, 4, 5, 6, 0]

3.呼叫Arrays.copyof( original, newlength);//original:原陣列,newlength:開闢大小為新陣列長度的空間
該函式呼叫Systrm.arrayscopy()

int[] arr = {1,2,3,4,5,6};
int[] brr = {1};
brr =Arrays.copyOf(arr,3);
System.out.println(Arrays.toString(brr));  //[1, 2, 3]
brr =Arrays.copyOf(arr,6);
System.out.println(Arrays.toString(brr));  //[1, 2, 3, 4, 5, 6]

由示例可以看到拷貝與dest的初始大小無關所以用該方法可以於給陣列進行擴容 arr = Arrays.copyOf(arr,arr.length+3);
同樣該方法也可以對陣列進行縮容(如果刪除元素沒有縮容會打印出無效值)
arr = Arrays.copyOf(arr,arr.length-1);
但是該方法是在堆中重新開闢空間,所以必定會改變陣列的首地址,所以在方法中對陣列進行該操作主函式內不可以呼叫。

public static void main(String[] args) {
        int[] arr = new int[]{1};
        change(arr);
        System.out.println(arr[0]);  //輸出1
    }
    public static void change(int[] arr){
        arr = Arrays.copyOf(arr,arr.length+1);
        arr[0] = 99999;
    }

4.呼叫object.clone()//對於自己建立的類必須通過介面實現

int[] arr = {1,2,3,4,5,6};
int[] brr = arr.clone();
System.out.println(Arrays.toString(brr));   //[1,2, 3, 4, 5, 6, 0]

5.呼叫Arrays.copyOfRange(original,from,to)

int[] arr = {1,2,3,4,5,6};
int[]  brr = Arrays.copyOfRange(arr,1,4);
System.out.println(Arrays.toString(brr));