【问题标题】:Java - Clone list that holds references to original ListJava - 包含对原始列表的引用的克隆列表
【发布时间】:2015-03-13 18:45:46
【问题描述】:

我不知道在 Java 中复制 List 是如何工作的。我有这个代码:

List<String> copy = new ArrayList<String>(original);

这是否会创建一个名为 copy 的新列表,它只包含对原始列表中对象的引用? (这就是我要的)。还是会创建新的字符串对象并占用不必要的内存?

当我从副本列表中删除项目时,这只会删除引用而不从两个列表中删除对象吗?

感谢阅读!

【问题讨论】:

  • 将创建新的字符串对象。如果您从copy 中删除,它不会从original 中删除。如果你这样做List&lt;String&gt; copy = original,那么你只是在做一个参考,在copy中改变会改变original
  • @gtgaxiola 这不会生成新的 String 对象。它只会用相同的旧列表填充列表。此外,您不会更改 copy,而是更改“存储在”copy 中的实体,这恰好是“存储在”original 中的同一实体。

标签: java list copy clone


【解决方案1】:

copy 列表将包含对相同 String 对象的引用。这称为浅拷贝。它不会创建元素的副本;它将创建元素引用的副本。

original -->  [ +      +       +  ]
                |      |       |
                v      v       v
               "one"  "two" "three"
                ^      ^       ^
                |      |       |
    copy -->  [ +      +       +  ]

当您从一个列表中删除一项时,您仅从该列表中删除了引用。另一个列表中的对应引用仍然完好无损。

original -->  [ +      +       +  ]
                |      |       |
                v      v       v
               "one"  "two" "three"
                ^      ^
                |      |
    copy -->  [ +      +  ]

【讨论】:

  • 非常感谢,抱歉回复晚了。真的说得很清楚:)
【解决方案2】:

它创建了一个全新的 ArrayList,其中填充了原始 String 对象。您可以使用== 运算符比较实例(“内存位置”)来验证这一点:

original.get(0) == copy.get(0) // true

.remove 方法仅从您调用它的列表中删除元素。它不会在任何可能使用它的地方将其从存在中删除(而且您实际上不能在 Java 中这样做)。由于copy 列表是一个全新的列表,而不是由original 列表“支持”,因此从原始列表中删除某些内容不会影响副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2012-02-13
    • 2013-03-08
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    相关资源
    最近更新 更多