2013-06-05 18 views
1

我试图编写我自己的ArrayList版本(了解它是如何工作的),并且我正在查看Cloneable接口,该接口由java.lang.ArrayList执行(我想保留与原始版本相同的合同) 。Cloneable和Collection

我对clone()方法的定义有点困惑,希望有人能为我的情况阐明它。

我不确定的部分是,如果某人在我的集合上使用了clone()方法,它应该返回一个新的ArrayList(意味着不是对现有引用的引用)。 但是:

  1. 这是否意味着每个包含的对象都需要被克隆?
  2. 我是否必须使用'新'为每个显式创建一个新的实例(这应该是很慢?)
  3. 我应该尝试在我的集合的对象上使用clone()方法,以及如何确保它们覆盖clone()方法,因为Cloneable中的定义表明它不是明确需要的(该方法不在Interface中)?

在此先感谢您的帮助。

+0

你给说必须做一个现场的场复制链接。对我来说,这听起来像是一个浅拷贝,而不是一个深层(递归)拷贝。 – Patashu

+1

参见http://stackoverflow.com/questions/4081858/about-java-cloneable –

回答

3

在集合的上下文中,合同将获得一个新集合,其中包含相同的对象,而不是对象的副本或克隆。其他任何事情都会破坏合同。

所以你想要的是在新集合中元素的“浅”副本,只是它们的引用。你对克隆/新建议的建议是一个“深层复制”,这是非常不同的,在这种情况下你不应该这样做。

所以

  1. 你绝对不应该克隆每个集合对象。
  2. 相同1.你不应该使用新的,这将做一个“深”的集合副本。
  3. 不一样,同样1. 2.
+0

在这种情况下,下面的语句就足够了吗? return new ArrayList ().addAll(this); – clement

+0

那么只要方法'addAll'返回'new ArrayList'就可以了。但是,通常'addAll'会返回一个布尔值。 – greedybuddha

+0

是的,明白了,就这样写下来,但明白了原则,谢谢! – clement