2013-07-10 85 views
0

我想複製一個ArrayList,但它似乎只是引用它,並沒有真正複製它。Java arraylist副本 - 克隆?

我的代碼:

List<Column> columns = columnData(referencedField.table); 
List<Field> newPath = new ArrayList<>(startPath); 
System.out.println("Equals? " + (newPath.equals(startPath))); 

startPathArrayList<Field>被傳遞給函數。

場:

public class Field 
{ 
    public String table; 
    public String column; 

    public Field(final String table, final String column) { 
     this.table = table; 
     this.column = column; 
    } 

    @Override 
    public String toString() { 
     return "(" + table + ", " + column + ")"; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 3; 
     hash = 67 * hash + Objects.hashCode(this.table); 
     hash = 67 * hash + Objects.hashCode(this.column); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     final Field other = (Field) obj; 
     if (!Objects.equals(this.table, other.table)) { 
      return false; 
     } 
     if (!Objects.equals(this.column, other.column)) { 
      return false; 
     } 
     return true; 
    } 
} 

現在我已閱讀有關克隆它,但我不是在它經歷。我實際上想知道一個克隆是否真的會創建一個新對象的列表,使得它們不再相同,因爲相同的內容元素將是平等的。

所以要改一下,我要的是:要確保startPathnewPath是不相等的,正如我現在用的列表遞歸函數應該列表添加到地圖因此不參考海誓山盟。

回答

1

如果您在類中使用重寫的equals方法而不是引用相等,則複製的集合將等於原始的:-)。

如果您正確地重寫了equals方法,那麼就沒有辦法讓這種情況發生。無論你如何克隆或複製它們,它們仍然是一樣的。

讓我詳細說明。

List<Field> newPath = new ArrayList<>(startPath); 

會很好地複製startPath的內容。它調用一個本地函數來複制內部數組,這樣可以確保您的對象被深度複製。

問題是在方法ArrayList的方法equals工作。那麼這不是問題,這是做到這一點的正確方法,但這是你在這個特殊情況下沒有得到平等的原因。

當你調用

newPath.equals(startPath) 

它會遍歷元素,並使用他們的equals方法比較他們。如果元素類型的equals方法被覆蓋以考慮它的狀態而不是默認的引用相等(類似於您的Field類),那麼這兩個列表中的所有元素都是相等的。

因爲即使它們不是相同的對象,它們的數據也是相等的。

+0

好像我需要將函數從遞歸轉換爲迭代,然後在每次迭代結束時存儲List。正如現在列表正在「同時」修改,至少不是爲了順序。 – skiwi

3

您需要進行深層複製。

List<Field> newPath = new ArrayList<>(); 
for(Field field: startPath){ 
    newPath.add(field.clone()); 
} 
+0

如果我們正在考慮引用平等是的,這會有所幫助。但是現在如果檢查值是否相等。 – Thihara