我有一个类型为my model的ArrayList,它包含3个项目,即ArrayList大小为3.
ArrayList<Model> mModels; // mModels.size() = 3
我必须将此ArrayList复制到另一个ArrayList中,因此我创建了另一个相同类型的ArrayList,如下所示。
ArrayList<Model> localModels = new ArrayList<>(mModels.size());
下一步是将数据从成员变量复制到局部变量,因为我不想复制我使用的成员变量的引用 Collections.copy()
Collections.copy(localModels,mModels);
但是我通过告诉目标大小应该大于源大小来获取ArrayOutOfBoundException。所以我记录了两个可变大小。然后对于成员我得到的大小为3,而localVariable则将大小记录为0.
更新
我尝试将成员ArrayList复制到本地。但它只复制参考。有没有办法复制数据而不是参考?
我尝试了这些方法
//1
for(Model model: mModels){
localModels.add(model);
}
//2
for(Model model: mModels){
localModels.add((Model)model.clone());
}
//3
Collections.copy(localModels, mModels);
//4
localModels = (ArrayList<Model>)mModels.clone();
//5
localModels = new ArrayList<>(mModels);
所以我的问题是
1-如何从一个ArrayList复制(值更改不应该反映)值到另一个?
2-为什么java / android总是复制引用
3- 如何初始化具有预定义大小的ArrayList (已经回答)
答案 0 :(得分:5)
ArrayList<Model> localModels = new ArrayList<>(mModels.size());
创建一个ArrayList
,其初始容量等于mModels.size()
(在您的示例中为3),但它包含0个元素。
您必须向ArrayList
添加元素才能拥有正数的元素。
如果您希望localModels
ArrayList
包含与mModels
相同的元素,可以使用以下内容对其进行初始化:
ArrayList<Model> localModels = new ArrayList<>(mModels);
这将为您提供原始ArrayList
的浅表副本。
答案 1 :(得分:1)
您可以使用其构造函数直接复制ArrayList:
ArrayList<Model> localModels = new ArrayList<>(mModels);
然后就不需要使用Collections.copy。
答案 2 :(得分:0)
最后我找到了答案:
我必须将模型中的每个字段分别复制到第二个ArrayList
喜欢
ArrayList<Model> localModels = new ArrayList<>(mModels.size());
for(Model model: mModels){
Models tempModel = new Model();
tempModel.setId(model.getId());
tempModel.setName(model.getName());
....
....
localModels.add(tempModel);
}
return localModels();
这是将一个ArrayList中的内容复制到另一个ArrayList的方法。发布的任何其他方法仅复制参考
答案 3 :(得分:-1)
数组列表具有动态大小,因此您无需使用预定义的大小对其进行初始化。您可以使用ArrayList.addall()将一个List对象的内容添加到另一个。
请在此处查看文档 - http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#addAll(java.util.Collection)