ArrayList浅拷贝迭代或克隆()

tec*_*0nn 16 java

我需要一个java的浅表副本ArrayList,我应该使用clone()或迭代原始列表并将元素复制到新的arrayList中,哪个更快?

Bar*_*ers 44

无需迭代:

List original = ...
List shallowCopy = new ArrayList(original);
Run Code Online (Sandbox Code Playgroud)

http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29

  • 但这不是线程安全的。(到这里结束是因为我这样做时遇到 ConcurrentModificationException ) (3认同)

Boz*_*zho 10

使用clone(),或使用复制构造函数.

复制构造函数从传递的集合到数组进行额外的转换,而该clone()方法直接使用内部数组.

请记住,clone()返回Object,所以你将不得不施展List.

  • 我不会太担心效率。使用 clone() 很痛苦;只需按照建议使用转换构造函数。 (2认同)
  • @Kevin Bourrillion为什么你认为使用`clone()`是痛苦的?实现`clone()`很痛苦,而不是使用它. (2认同)
  • 通常,您永远不想编写大量依赖于实现类的代码,`ArrayList`; 普遍认可的最佳实践是限制您对"List"等接口类型的依赖.但是你不能克服一个`List`而不知道究竟是什么实现类型(`ArrayList`,`LinkedList`等)你可以先把它转发给它!然后,一旦你得到结果,它就是一个"对象",所以你也必须投射它!最重要的是,一些实现不会费心吞下他们自己的`CloneNotSupportedException`s.最糟糕的是,因为这更痛苦(续) (2认同)
  • ...与简单的转换构造函数相比,许多库根本不会费心玩克隆游戏。社区在很大程度上受够了这一切。我建议你完全忘记克隆的概念甚至存在,偶尔克隆一个数组可能是个例外,这很方便。坦率地说,情况是如此糟糕,以至于我听到有人声称使用它并不痛苦时感到震惊! (2认同)

Mic*_*rdt 8

您可以使用复制构造函数而不是手动迭代.

至于它与使用之间的速度差异clone():

  1. 没关系
  2. 很可能没有
  3. 为您的特定系统配置和用例做一个基准测试