2012-10-24 71 views
1

我在嘗試理解基本節點列表的代碼時遇到問題。節點(類ListNode)包含三個變量;一個字符串「鍵」,一個值「值」,然後另一個節點「下一個」。到現在爲止還挺好。然而,與貼切的名稱列表地圖類,我們有,我有一個很難作出的意義上的put()方法:瞭解節點列表

public void put(String key, int value) { 
    ListNode l = search(key, head); 
    if (l==null) { 
     head = new ListNode(key, value, head); 
    } else { 
     l.value = value; 
    } 

protected static ListNode search(String key, ListNode l) { 
    if (l==null) { 
     return null; 
    } else if (key.equals(l.key)) { 
     return l; 
    } else { 
     return search(key, l.next); 
    } 
} 

字符串「鍵」的方法搜索,如果有一個在列表中,它用作爲第二個參數給出的新值替換它的值。
我無法得到我的頭是這個變量l,它被分配與第一個參數共享相同的「密鑰」或字符串的節點。
當l.value設置爲值時,爲什麼這會影響列表?
不是變量l只是列表中的一個節點的副本,而不是實際的節點?
對於這樣一個令人困惑的問題,我提前表示歉意,但我希望你們其中一個能夠理解它。

回答

0

是不是變量l只是列表中的一個節點的副本,而不是實際的節點?

不,它是對節點的引用(就像C語言中的指針一樣)。您可以對同一個對象進行多次引用,並且當通過不同的引用訪問同一個對象時,通過一個引用對該對象所做的更改當然是可見的。這就像別名。

下面是一個簡單的例子:

class ListNode { 
    int value; 
} 

ListNode first = new ListNode(); 
ListNode second = first; 
first.value = 42; 
System.out.println(second.value); //42 
+0

感謝您抽出寶貴的時間。 我明白了,這樣的情況總是如此嗎? 什麼時候它是一個參考,什麼時候是一個副本,如果它是一個副本? – Alex

+0

@ user1772056:除非您明確地調用對象上的clone(),否則它絕不是副本。這在正常的Java開發中非常罕見。 –

+0

http://javadude.com/articles/passbyvalue.htm – Mik378