[英]How do references in Java work?
當我們在鏈接列表的開頭插入節點時,可以使用以下代碼:
Node oldfirst = first;
first = new Node();
first.item = "not";
first.next = oldfirst;
而Node的定義如下
private class Node
{
Item item;
Node next;
}
我的問題是,因為在Java中,對象變量是引用,所以oldfirst和first應該始終指向同一節點。 如果是這樣,則無法將節點插入到頭部。 我哪里錯了?
在解決“合並兩個排序的列表”問題時,我也找到了這樣的代碼:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode p1 = l1;
ListNode p2 = l2;
ListNode fakeHead = new ListNode(0);
ListNode p = fakeHead;
while(p1 != null && p2 != null){
if(p1.val <= p2.val){
p.next = p1;
p1 = p1.next;
}else{
p.next = p2;
p2 = p2.next;
}
p = p.next;
}
if(p1 != null)
p.next = p1;
if(p2 != null)
p.next = p2;
return fakeHead.next;
}
}
在上面的代碼中,p是dummyHead的引用,因此當返回p時,p已更改,dummyHead.nex是否仍是合並列表的頭?
謝謝!
這將解釋:
Node oldfirst = first; // oldFirst points to the same node as first
first = new Node(); // first now points to a new node.
// oldFirst stays pointing to the original first node
first.item = "not"; // update the item of the new first node
first.next = oldFirst; // .next of the new node points to the old original first node
因此,此代碼在列表的開頭插入了一個新節點。
引用本身就是變量,它們只是指向內存中的地址。
在你的情況,oldFirst和第一是指向同一個對象的不同引用,這就是為什么當你設置第一點別的東西,oldFirst不會受到影響,因為它是一個不同的參考,其實它是第一參考的副本 ,但不一樣的參考。
如果仍然不了解'int'數據類型,則可以將int = 10; 並且int b = 10; 兩個int都“指向”相同的整數,當您將a設置為等於12時,b不受影響,引用的工作方式相同。
在C#中,您可以按引用和按值將引用傳遞給函數(在Java中不能按引用傳遞)。 因此,如果您有一個功能:
void Foo(ref SomeType x); // pass by reference
在函數Foo的范圍內,您將具有傳遞給此函數的相同內容,因此,如果將x重置為指向其他對象,則將更改傳遞給此函數的內容。
但是,如果您這樣寫:
void Foo(SomeType x);
然后x將按值傳遞,這意味着x將是您傳遞給函數Foo的引用的副本,並且如果將其重置為指向其他內容,則不會影響傳遞給該函數的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.