我需要一个Java ArrayList
的浅拷贝,我应该使用 clone()
还是迭代原始列表并将元素复制到新的 ArrayList
中,哪个更快?
我需要一个Java ArrayList
的浅拷贝,我应该使用 clone()
还是迭代原始列表并将元素复制到新的 ArrayList
中,哪个更快?
无需迭代:
List original = ...
List shallowCopy = new ArrayList(original);
http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29
使用 clone()
方法或使用复制构造函数来实现。
复制构造函数会将传递的集合转换为数组,并进行其他的一些变换,而 clone()
方法直接使用内部数组。
请注意,clone()
方法返回的是 Object
,因此需要将其强制转换为 List
。
clone()
很痛苦?实现clone()
才是痛苦的,而不是使用它。 - BozhoArrayList
的代码;通用的最佳实践是将依赖限制在诸如List
之类的接口类型上。但是,在不知道可以向下转换为哪种实现类型(例如,ArrayList
、LinkedList
等)之前,您无法克隆List
!然后,一旦获得结果,它就是一个Object
,因此还需要进行强制类型转换!最糟糕的是,某些实现不会忽略它们自己的CloneNotSupportedException
。更糟糕的是,因为这非常麻烦(续)。 - Kevin Bourrillion问题中提到的是浅拷贝而不是深拷贝。直接从一个ArrayList引用复制到另一个引用也可以正常工作。深拷贝包括复制ArrayList中的每个元素。
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(3);
ArrayList<Integer> list1=list; //shallow copy...
这里有什么问题吗?
ArrayList
对象。在一个列表中添加一个 Integer
也会让这个 Integer
在另一个列表中出现,而这并不是我们想要的结果。浅拷贝使底层对象共享相同的内存空间,但列表具有独立的内存空间。所以如果你修改一个 Integer
,这个改变将会反映在两个列表中。但是如果你向一个列表中添加一个 Integer
,它不会出现在另一个列表中。深拷贝不会在另一个列表中反映出任何的更改。 - Antimonit