我有一个
形式的嵌套ArrayList
ArrayList<ArrayList<PointF>> nestedArraylist
我想在以下意义上创建nestedArraylistCopy
的{{1}}:
nestedArraylist
的元素应该是nestedArraylistCopy
中元素的独立副本,即应该是包含对相同 {的引用的ArrayLists {1}}原始nestedArraylist
中的对象。
我可以以某种方式使用PointF
来做我想要的吗?遗憾的是,文档并不完全详细...
以下代码是否符合我的要求?
nestedArraylist
是否有更高效,更优雅的解决方案?
答案 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);