2011-01-25 2 views
1

コレクションのディープコピーを扱うフォーラムを検索しましたが、私の手ではCollections.copy(dest、src)が期待通りに動作しません。私は何か見落としてますか?Collections.copy(dest、src)まだソースコレクションを参照しています

List<Column> mergedStudies = new ArrayList<Column>(Arrays.asList(new Column[studyColumns.size()])); 
    Collections.copy(mergedStudies, studyColumns); 

    for (Iterator itrStudyRecColumns = mergedStudies.iterator(); itrStudyRecColumns.hasNext();) { 
     Column studyRecCol = (Column) itrStudyRecColumns.next(); 
     for (Iterator itrStudyValColumns = studyValueColumns.iterator(); itrStudyValColumns.hasNext();) { 
      Column studyValCol = (Column) itrStudyValColumns.next(); 
      if (studyRecCol.getColumnName().equals(studyValCol.getColumnName())) { 
       // Note: this method dereferences copies to an existing destination collection WITH items appended to end of collection. 
       CellValue[] cellValArray = studyValCol.getCellValues().toArray(new CellValue[studyValCol.getCellValues().size()]); 
       studyRecCol.getCellValues().addAll(new ArrayList<CellValue>(Arrays.asList(cellValArray))); 
       break; 
      } 
     } 
    } 

おかげで、

クリス

+0

ColumnはCloneableインターフェイスを実装していますか? – helpermethod

答えて

1

Collections.copy()はしていません(またそれはに主張しない)深いコピーを実行します。他に

コピーのすべての要素を1つのリストから。操作の後、宛先リスト内のコピーされた各要素の索引は、ソース・リスト内の索引と同じになります。宛先リストは、少なくともソースリストと同じ長さでなければなりません。それより長い場合、宛先リストの残りの要素は影響を受けません。

これは、浅いコピーを作成するだけです(結果として、各リスト内の参照が同じオブジェクトセットにコピーされます)。

+0

ディープコピーをサポートするコレクションインターフェイス(または別のもの)はありますか? – Chris

+0

問題が解決しました。この問題を経験している他の人のために、私は、浅く深いクローンチュートリアルを持った次の有用なURLを使用しました:http://www.idevelopment.info/data/Programming/java/object_oriented_techniques/CloningExample.java – Chris

関連する問題