2012-04-03 102 views
1

我想學習Java中鏈表和有大約代碼如下一些問題:如何在鏈表中創建根節點?

public class List { 
    Node root; 
    public List() { 
     // constructor 
    } 

    public int pop() { 
     // pop logic 
    } 

    public int push(int data) { 
     // push logic 
    } 
} 

我想有彈出,推動數據到鏈表List類。但是,由於列表在實例化時沒有任何默認數據,因此存儲對根節點的引用的最佳方式是什麼?

在C,我只想有一個像指針:

Node * root; 

但由於Java沒有指針,就會有一個簡單的聲明,如:

Node root; 

...是否可以接受?我有一段時間沒有使用過Java,但是沒有將內存分配給作爲類變量聲明的對象導致潛在的內存問題?謝謝!

+1

變量存儲值。對於非基元類型,這些值(內部)是對對象的「引用」,或者是null。我更喜歡使用術語「名稱」,例如'Node n1 = new Node();節點n2 = n1;' - >新節點「由n1和n2(它是*相同*節點對象)命名,因爲兩個變量將」評估「到相同的對象。這種行爲類似於C/C++中的指針。對於非基元類型,在賦值時(或傳遞給方法時)有* no *隱式複製/複製/克隆;這與C++中的複製構造函數不同。 – 2012-04-03 22:32:04

回答

3

是的,像Node root這樣的簡單聲明是可以接受的。它實際上不是一個指針,而是一個可能涉及任何Node的引用。

Java中的引用在概念上等同於C指針,但不夠靈活並且使用更簡單的語法。

1

是,

Node root; 

是可以接受的。 Java中的每個非原始對象(包括基元或對象的數組)實際上都是對象的引用,所以它在很多方面就像一個C指針。

它實際上非常像一個指針,這個聲明本身並不是實際創建一個對象。這是一個沒有指向任何內容的參考,如果您在首先將它分配到new Node()之前嘗試使用root,您將得到一個NullPointerException

1

是的,Node root;絕對沒問題。只要確保你不改變root的價值。爲了使用它,創建另一個變量,遍歷路徑:Node start = root;這樣root保持不變。

​​

不,它不。雖然簡單地寫Node root;不會分配任何內存,root = new Node();會。請注意,java中的class members是靜態的,非靜態成員是global variables。在java中分配內存給全局變量是一種常見的做法。例如,您實際存儲該列表的變量,將是是一個全局變量,並且您將必須分配內存給它。

Java擁有強大的內存管理系統,因此您不會輕易地遇到內存問題。