使用2个ArrayList,我想知道将第一个转换为第二个的“副本”的最佳方式是
myFirstArray.clear();
myFirstArray.addAll(mySecondArray);
或
myFirstArray = mySecondArray.clone();
这两种方法之间的主要区别是什么,哪种方法是优选的,还有另一种“更容易”或“更清洁”的解决方案。感谢您的任何提示
编辑:我使用此副本替换当前使用的项目数组,我将在下一个循环中存储我将使用的项目。在循环结束时,我用我的futurArrayList替换了我的currentArrayList,并清除了我的futurArraylist,以便在其中添加新项目(我希望它足够清晰)
答案 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调用克隆时,请执行以下操作:
如果类只有原始数据类型成员,那么完全 将创建对象的新副本并引用新的 将返回对象副本。
如果类包含任何类类型的成员,则只包含该对象 对这些成员的引用被复制,因此被复制 原始对象和克隆对象中的引用 引用相同的对象,因为克隆的对象更改在原始对象中也可见。
答案 3 :(得分:0)
番石榴,番石榴,番石榴!
final List copied = ImmutableList.copyOf(originalList);