簡體   English   中英

Java中的引用如何工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM