将值从ArrayList传输到另一个的最佳方法

时间:2013-07-23 12:13:44

标签: java

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

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

myFirstArray = mySecondArray.clone();

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

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

4 个答案:

答案 0 :(得分:13)

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

如果列表被其他某个对象引用,并且您希望其他对象不受影响,请使用第二个对象。如果您希望其他对象也具有新内容,请使用第一个。

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

答案 1 :(得分:1)

使用:

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

我还建议您根本不使用clone()。最好使用复制构造函数或某些工厂方法。看看here

当然,在您的情况下,使用ArrayList,它会按预期工作,您最终会得到一份参考文献。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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

final List copied = ImmutableList.copyOf(originalList);