ArrayList没有使用预定义大小进行初始化。

3

我有一个类型为我的模型的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,对于本地变量,记录的大小为0。

更新

我已经尝试将成员ArrayList复制到本地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的值复制到另一个ArrayList中(改变值不应该反映出来)?

2- 为什么Java/Android总是复制引用?

3- 如何初始化具有预定义大小的ArrayList(已经回答)


抱歉,如果你想从一个ArrayList复制另一个ArrayList,你可以这样做:List<Integer> newList = new ArrayList<Integer>(oldList); - BrockLee
@Sotirios 这个问题怎么会被标记为重复的呢?你指出的那个问题和这个完全不同。 - droidev
你似乎把初始容量和大小混淆了。这两个是不同的东西。你试图将三个元素复制到一个没有三个元素的列表中。 - Sotirios Delimanolis
@SotiriosDelimanolis 实际上在发表这个问题之前我已经看过那个问题了。我发出这个问题只是因为那个问题与我的情况不同。 - droidev
如果您认为链接中的帖子没有回答您的问题,请编辑您的问题以解释您的想法。 - Sotirios Delimanolis
@SotiriosDelimanolis,您现在可以重新加载问题了。 - droidev
4个回答

5
ArrayList<Model> localModels = new ArrayList<>(mModels.size());

创建一个初始容量等于 mModels.size()(在您的示例中为 3)但不包含任何元素的 ArrayList
您必须添加元素到 ArrayList 中,以使其具有正数个元素。
如果您希望您的 localModels ArrayList 包含与 mModels 相同的元素,则可以使用以下方式进行初始化:
ArrayList<Model> localModels = new ArrayList<>(mModels); 

这将为您提供原始ArrayList的浅层副本。

如果我更改了localModels中的值,会影响mModels吗? - droidev
1
@robodev 如果你从 localModels 中添加或移除元素,它不会影响到 mModels。然而,如果你改变了 localModels 中的任何一个元素的状态,那么这个变化会反映在 mModels 中,因为两个列表都包含对同一对象的引用。 - Eran
有没有办法为局部变量获取单独的内存位置? - droidev
看看这个问题:https://dev59.com/Qmkv5IYBdhLWcg3wsCtO - Fausto Carvalho Marques Silva
请参考以下链接:https://dev59.com/kXRB5IYBdhLWcg3wHkPi - Fausto Carvalho Marques Silva

1
你可以直接使用 ArrayList 的构造函数进行复制:
ArrayList<Model> localModels = new ArrayList<>(mModels);

那么就没有必要使用 Collections.copy。


它只是复制引用,如果我在localModels中更改任何字段,则会影响成员。 - droidev
Collections.copy也是如此。它不知道如何深度复制您列表的内容。 - Andy Turner

-1

-1

终于我找到了答案:

我必须将模型中的每个字段分别复制到第二个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的方法。在问题中发布的任何其他方法都只会复制引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接