使用clone()取代new
在Java中新建物件實例最常用的方法是使用 new 關鍵字。 JDK對 new 的支援非常好,使用 new 關鍵字建立輕量級物件時,速度非常快。但是,對於重量級對象,由於物件在建構函式中可能會進行一些複雜且耗時的操作,因此,建構函式的執行時間可能會比較長。導致系統短期內無法獲得大量的實例。為了解決這個問題,可以使用Object.clone() 方法。
Object.clone() 方法可以繞過建構函數,快速複製一個物件實例。但是,在預設情況下,clone()方法產生的實例只是原始物件的淺拷貝。
這裡不得不提Java只有值傳遞了,關於這點,我的理解是基本資料型別引用的是值,普通物件引用的也是值,不過這個普通物件引用的值其實是物件的地址。程式碼範例:
int i = 0; int j = i; //i的值是0 User user1 = new User(); User user2 = user1; //user1值是new User()的内存地址
如果需要深拷貝,則需要重新實作 clone() 方法。以下來看看ArrayList實作的clone()方法:
public Object clone() { try { ArrayList<?> v = (ArrayList<?>) super.clone(); v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(e); } }
在ArrayList的clone()方法中,首先使用 super.clone() 方法產生一份淺拷貝物件。然後拷貝一份新的elementData陣列讓新的ArrayList去引用。使克隆後的ArrayList物件與原始物件持有不同的引用,實現了深拷貝。
以上是如何使用Java中的clone()方法來取代new關鍵字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!