"复印"嵌套数组列表

时间:2014-04-28 09:27:25

标签: java collections arraylist deep-copy

我有一个

形式的嵌套ArrayList
ArrayList<ArrayList<PointF>> nestedArraylist

我想在以下意义上创建nestedArraylistCopy的{​​{1}}:

nestedArraylist的元素应该是nestedArraylistCopy中元素的独立副本,即应该是包含对相同 {的引用的ArrayLists {1}}原始nestedArraylist中的对象。

  • 我可以以某种方式使用PointF来做我想要的吗?遗憾的是,文档并不完全详细...

  • 以下代码是否符合我的要求?

    nestedArraylist
  • 是否有更高效,更优雅的解决方案?

3 个答案:

答案 0 :(得分:3)

Q1:在你Collections.copy之后,你的新List对象将包含与src相同的元素(假设大小相同),这意味着它拥有相同的ArrayList<PointF>个对象,因此PointF个对象也是一样的。如果您无法从api java doc获得所需信息,请阅读源代码。

Q2:您所做的与Collections.copy不同,因为复制的arrayList有新的Arraylist<PointF>作为元素,但它们包含与源列表相同的元素(PointF)。 / p> 第三季:我不知道。因为我不知道你最终会想要什么。所有新物品?只有ArrayList应该是新对象,还是所有引用?

答案 1 :(得分:1)

根据我的知识,您的解决方案将仅更新引用,Collection.copy()也是如此。您可以使用以下方法,我更喜欢:

 List<ArrayList<PointF>> newList = new ArrayList<ArrayList<PointF>>(oldList);

更改旧列表不会影响新列表。

我测试了你的第二个选项,它还具有更改旧版本的属性不会影响新列表。

注意 - 这些也只会更新引用。如果更改新列表中的元素,它也会更新旧列表。我认为你的第二个阵列将创建全新的对象,但我不是百分之百确定。我在下面添加我的测试代码供您参考。

package test;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Lasitha Benaragama on 4/28/14.
 */
public class StckTest {

public static void main(String[] args) {
    List<String> oldList = new ArrayList<String>();
    oldList.add("AAAAA");
    oldList.add("BBBBB");
    oldList.add("CCCCC");
    oldList.add("DDDDDD");
    oldList.add("EEEEEE");

    StckTest test = new StckTest();

    List<String> newListCopy = new ArrayList<String>(oldList);
    List<String> newListClone = new ArrayList<String>();

    for(int i = 0; i < oldList.size(); i++)
        newListClone.add(oldList.get(i));

    test.printArray(newListCopy);

    test.changeList(oldList);
    test.printArray(oldList);

    test.printArray(newListCopy);
    test.printArray(newListClone);
}

public void changeList(List<String> oldList) {
    oldList.remove(2);
    oldList.add("FFFFF");
}

public void printArray(List<String> oldList){
    for(int i = 0; i < oldList.size(); i++){
        System.out.print(oldList.get(i)+",");
    }
    System.out.println();
}

}

答案 2 :(得分:0)

您可以使用 clone()方法制作对象的浅表副本。

        ArrayList<ArrayList<String>> nestedArraylist=new ArrayList<ArrayList<String>>();
        ArrayList<String> x=new ArrayList<String>();
        x.add("Deepak");
        nestedArraylist.add(x);
        System.out.println(nestedArraylist);
        ArrayList<ArrayList<String>> nestedArraylistcopy=(ArrayList<ArrayList<String>>)nestedArraylist.clone();
        System.out.println(nestedArraylistcopy);