【问题标题】:Best way to transfer value from an ArrayList to another将值从 ArrayList 转移到另一个的最佳方法
【发布时间】:2013-07-22 12:09:09
【问题描述】:

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

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

myFirstArray = mySecondArray.clone();

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

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

【问题讨论】:

  • 要小心,如果您的列表是一堆引用类型,您最终可能会得到指向同一个对象的列表。
  • 只是一个风格注释:通常你的变量名应该以小写字母开头。不仅对于阅读代码的人来说,而且 stackoverflow 语法高亮也会感到困惑!
  • 你复制的目标是什么?了解您想要做什么将有助于我们为您提供最佳答案。

标签: java


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的精确,我的 Arraylist 确实被另一个对象引用,所以 addAll 是首选。
【解决方案2】:

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

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

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

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

【讨论】:

  • 就我而言,仅复制引用并不是真正的问题,因为我打算修改这些对象,因此具有相同的引用是有益的。但是感谢您的精确
【解决方案3】:

使用那个:

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

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

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

【讨论】:

  • 我不想要参考副本。我想创建一个新列表并对其进行编辑。我怎么能做到?
  • 如果您想要列表的深层副本,您必须为列表中的每个对象创建一个副本。我建议您为对象创建一个复制构造函数,然后迭代旧的并填充新的。
【解决方案4】:

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

final List copied = ImmutableList.copyOf(originalList);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多