天天看點

數組與對象的拷貝【Java拾遺】

一、數組的拷貝主要有以下幾種方式。

1、Object.clone()

  該方法繼承自Object類,數組元素為基礎資料類型(boolean、char、byte、short、int、float、double、long)或String類型,均可使用。

    int[]  arr1 = {1,2,3};    int[]  arr2 = arr1.clone();  //arr2={1,2,3}

    String[] arr1 = {"a", "b"};   String[] arr2 = arr1.clone();  //arr2= {"a", "b"}

  

2、System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

  傳參說明:arraycopy(源數組, 源數組起始位置, 目标數組, 目标數組其實位置, 拷貝長度)

  該方法是本地方法,效率較高。但是使用該方法時,必須傳入一個已配置設定記憶體的數組作為目标數組。

    int[]  arr1 = {1,2,3};    int[]  arr2 = new i;nt[5];    System.arraycopy(arr1,0,arr2,0,3);  // arra2={1,2,3,0,0}

3、Arrays.copyOf(Object src, int length) 和 Arrays.copyOfRange(Object src, int srcPos, int length)

  傳參說明copyOf(源數組, 拷貝長度),copyOfRange(源數組,  源數組起始位置, 拷貝長度)

  這兩個方法底層實質上也是使用的System.arraycopy方法,隻是經過了一層封裝。

    int[]  arr1 = {1,2,3};    int[] arr2 = Arrays.copyOf(arr1,3);  // arra2={1,2,3}

    int[]  arr1 = {1,2,3};    int[] arr2 = Arrays.copyOfRange(arr1,1,2);  // arra2={2,3}

二、對象的拷貝

  基本資料類型的拷貝是值的複制,新舊數組各自獨立,是以拷貝後的數組再進行更新,互相不會影響。但是引用類型卻不可如此使用(String類型可以使用,是因為其值為final的不可變)。因為對象建立是在堆中配置設定空間,而數組的拷貝隻是拷貝棧中對象的引用,對象改變後,所有指向該對象的引用都會發生變化。是以對象的拷貝要實作“深度拷貝”。

  對象的拷貝,一般采用的方式是讓需要拷貝的對象實作 Cloneable 接口,并重寫起 clone() 方法。

  若是對象的成員包含其他對象,則必須所有對象均實作Cloneable接口,或者讓組合對象實作 Serializable 序列化接口,通過對象流的序列化和反序列化來實作。

參考文獻:(文章僅做交流學習,侵權即删!!)

1、https://blog.csdn.net/u011669700/article/details/79323251

簡單的才是最好的。