2015-02-23 68 views
0

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

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

感谢您的帮助。

+11

_Java据我所知,通过reference_传递对象。不,Java根本不传递对象,更不用说引用了。 – 2015-02-23 22:55:04

+4

开始区分变量,值和对象。 – 2015-02-23 22:55:49

+3

@SotiriosDelimanolis这是多么普遍的教导,这很可悲。当然,你是对的。 – jpmc26 2015-02-23 22:56:08

回答

4

Java作为我的理解经过参照物..

号的Java按值传递的一切。如果您有参考类型,则按值传递参考。请参阅this question.

如果我有一个名为A的链接列表,并且我做了温度B = A。get(i),我检索一个对象B,我可以修改,并且这些更改反映在A.get(i)中。

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

但是,如果对象B在其中(说另一个LinkedList对象),我没有得到一个深复制正确?

正确。你会得到一个参考。

是在这个例子中,我必须为我的类'temp'创建拷贝构造函数的解决方案。还是有更好的,内置的方式来做到这一点?

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

4

Java作为我的理解经过参考

号它按值传递引用的对象。它不会传递任何对象[除了RMI的情况。]

所以如果我有一个名为A的链表,乙

号您检索参考指B.同B,其引用时,您添加它到列表中通过。

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

是的,见上文。

但是,如果对象B在其中(说另一个LinkedList对象),我没有得到一个深复制正确?

正确。就像第一个案例一样。没有任何区别。

是在这个例子中,我必须为我的类'temp'创建拷贝构造函数的解决方案。

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

还是有更好的,内置的方式来做到这一点?

要做什么?

0

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

// 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)将获得对列表中第三个对象的引用。它引用的对象的对象,而不是副本。所以在这个对象中的任何引用,变量,方法等都会在那里。

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