Java 可克隆和收集

Java 可克隆和收集,java,Java,我正在尝试编写我自己版本的ArrayList(以了解它是如何工作的),我正在查看由实现的接口(我希望保留与原始版本相同的契约) 我对clone()方法的定义有点困惑,希望有人能为我澄清一下 我不确定的是,如果有人在我的集合中使用clone()方法,它应该返回一个新的ArrayList(这意味着不是对现有ArrayList的引用)。 然而: 这是否意味着包含的每个对象也需要克隆 我是否必须为它们中的每一个显式地使用“new”创建一个新实例(这应该相当慢?) 我是否应该尝试在集合的对象上使用clon

我正在尝试编写我自己版本的ArrayList(以了解它是如何工作的),我正在查看由实现的接口(我希望保留与原始版本相同的契约)

我对clone()方法的定义有点困惑,希望有人能为我澄清一下

我不确定的是,如果有人在我的集合中使用clone()方法,它应该返回一个新的ArrayList(这意味着不是对现有ArrayList的引用)。 然而:

  • 这是否意味着包含的每个对象也需要克隆
  • 我是否必须为它们中的每一个显式地使用“new”创建一个新实例(这应该相当慢?)
  • 我是否应该尝试在集合的对象上使用clone()方法,以及如何确保它们重写clone()方法,因为Cloneable状态下的定义没有明确要求它(该方法不在接口中)

  • 提前感谢您的帮助。

    在收藏中,合同是使用相同的对象获取新收藏,而不是对象的副本或克隆。其他任何事情都会破坏合同

    因此,您需要的是新集合中元素的“浅”副本,只是它们的引用。您对克隆/新建的建议是“深度复制”,这是非常不同的,在这种情况下您不应该这样做

    所以

  • 您绝对不应该克隆集合中的每个对象
  • 与1相同。你不应该使用新的,这将是做一个“深”的收集副本
  • 不,和1一样。二,

  • 你提供的链接说它必须做一个字段对字段的复制。对我来说,这听起来像一个浅拷贝,而不是一个深(递归)拷贝?返回新的ArrayList().addAll(此);只要方法
    addAll
    返回
    newarraylist
    ,就可以了。但是,通常,
    addAll
    返回一个布尔值。是的,明白了,就这样写吧,但明白了原理,谢谢!