2015-02-23 67 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)將獲得對列表中第三個對象的引用。它引用的對象的對象,而不是副本。所以在這個對象中的任何引用,變量,方法等都會在那裏。

我希望能回答你的問題:)