【问题标题】:Java LinkedList.get() does not return deep copy? [duplicate]Java LinkedList.get() 不返回深拷贝? [复制]
【发布时间】:2015-04-25 10:43:52
【问题描述】:

我有一个关于使用LinkedList.get() 操作的问题。据我所知,Java 通过引用传递对象,所以如果我有一个名为A 的链表,并且我做了temp B = A.get(i),我会检索一个我可以修改的对象B,并且更改会反映在A.get(i) 中。

但是,如果对象 B 在其中(比如说另一个 LinkedList 对象),我没有得到正确的深层副本吗?在这个例子中,我必须为我的类“temp”创建一个复制构造函数。还是有更好的内置方法来做到这一点?

感谢您的帮助。

【问题讨论】:

  • 据我所知,Java 通过引用传递对象。不。Java 根本不传递对象,更不用说通过引用了。
  • 开始区分变量、值和对象。
  • @SotiriosDelimanolis 遗憾的是,这种教学方式很普遍。当然,你是对的。
  • 回答您的问题 - 是的 LinkedList 不返回深拷贝。一般来说,Java 不会复制东西,而是传递值或地址供您参考。

标签: java


【解决方案1】:

它不会返回“深拷贝”,因为根本没有进行复制,至少在对象级别没有完成。让我解释。 当您有一个对象的实例时,引用该对象的变量是指向该对象的指针。该对象可以被许多变量(指针)引用和修改。观察以下代码:

// Let's assume I have a custom object class called Student
// Here the object is created and s now points to the new Student object
Student s = new Student();

// Here I create another variable that points to the same object
Student s2 = s;

这两个变量都指向同一个对象,一个变量对对象所做的任何更改都会反映在另一个变量中。

这与您的列表示例有关。如果你有一个对象的 LinkedList,它实际上是一个 指向 对象的列表。因此,在列表中调用 get(2) 将获得对列表中第三个对象的引用。它引用的对象 对象,而不是副本。因此,该对象中的任何引用、变量、方法等仍然存在。

我希望能回答你的问题:)

【讨论】:

    【解决方案2】:

    据我所知,Java 通过引用传递对象..

    没有。 Java 按值传递所有内容。如果你有一个引用类型,reference 是按值传递的。见this question.

    如果我有一个名为 A 的链表,并且我执行 temp B = A.get(i),我会检索一个我可以修改的对象 B,并且更改会反映在 A.get(i) 中。

    如果您有一个引用类型列表,get(i) 将返回对特定实例的引用。列表中的元素和您检索到的引用将引用相同的对象。因此,如果您以某种方式更改对象,它将在两个引用中都“可见”。

    但是,如果对象 B 在其中(比如说另一个 LinkedList 对象),我没有得到正确的深层副本?

    正确。你得到一个参考。

    在这个例子中,我必须为我的类“temp”创建一个复制构造函数。还是有更好的内置方法来做到这一点?

    如果您需要对象的深层副本,则必须自己实现它。

    【讨论】:

      【解决方案3】:

      据我所知,Java 通过引用传递对象

      没有。它按值传递引用。它根本不传递对象[RMI 除外。]

      所以如果我有一个名为 A 的链表,并且我执行 temp B = A.get(i),我会检索一个对象 B

      没有。您检索了一个引用 B 的 reference。当您将其添加到列表时,您传递了该 B 的引用。

      我可以修改并且更改会反映在 A.get(i) 中。

      是的,见上文。

      但是,如果对象 B 在其中(比如说另一个 LinkedList 对象),我没有得到正确的深层副本?

      正确。就像第一个案例一样。没什么区别。

      在这个例子中,我必须为我的类“temp”创建一个复制构造函数。

      解决方案是什么?自 1997 年以来,我从未在 Java 中使用过复制构造函数或 clone() 方法。您要解决什么问题?

      或者有没有更好的内置方法来做到这一点?

      做什么?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 1970-01-01
        • 2011-02-09
        • 2012-10-14
        • 2011-06-27
        • 1970-01-01
        相关资源
        最近更新 更多