8

使用 2 ArrayList,我想知道将第一个转换为第二个“副本”的最佳方法是否像

myFirstArray.clear();
myFirstArray.addAll(mySecondArray);

或者

myFirstArray = mySecondArray.clone();

这两种方法之间的主要区别是什么,哪种方法更可取,是否还有另一种“更简单”或“更清洁”的解决方案。感谢您的任何提示

编辑:我使用此副本替换我当前正在使用的项目数组,其中我存储了我将在下一个循环中使用的项目。在循环结束时,我用我的 futurArrayList 替换我的 currentArrayList 并清除我的 futurArraylist 以便在其中添加新项目(我希望它足够清楚)

4

4 回答 4

13

第一个用另一个内容替换列表的内容。第二个创建另一个 ArrayList 实例,而前一个保持不变。

如果列表被其他对象引用,并且您希望其他对象保持不变,请使用第二个。如果您希望另一个对象也具有新内容,请使用第一个。

如果没有其他内容引用该列表,则无关紧要。如果您用几个元素替换一个巨大列表的内容,第二个将减少使用的内存。

于 2013-07-23T12:16:05.250 回答
1

在 java 中,虽然 clone 是“打算”生成同一对象的副本,但不能保证。克隆带有很多它和但是。所以我的第一个建议是不要依赖克隆。

默认情况下,java 克隆是“逐个字段复制”,即 Object 类不知道将调用 clone() 方法的类的结构。因此,JVM 在调用克隆时,请执行以下操作:

  1. 如果类只有原始数据类型成员,则将创建对象的全新副本,并返回对新对象副本的引用。

  2. 如果类包含任何类类型的成员,则仅复制对这些成员的对象引用,因此原始对象和克隆对象中的成员引用都引用同一对象,因为克隆对象的更改在原始对象中可见还。

于 2013-07-23T12:30:54.657 回答
1

使用它:

List<Object> first = ...
ArrayList<Object> second = new ArrayList<>(first);

我也建议你根本不要使用clone()。最好使用复制构造函数或一些工厂方法。看看这里

当然,在您的情况下,使用ArrayList, 它将按预期工作,您最终将获得参考的副本。

于 2013-07-23T12:16:15.930 回答
0

番石榴,番石榴,番石榴!

final List copied = ImmutableList.copyOf(originalList);
于 2013-07-23T12:41:42.273 回答