2012-04-03 21 views
1

Ich versuche, verknüpfte Listen in Java und hatte einige Fragen über den Code unten zu lernen:Wie erstelle ich einen Wurzelknoten in einer verknüpften Liste?

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

    public int pop() { 
     // pop logic 
    } 

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

Ich möchte eine Liste Klasse haben für popping und Daten in der verknüpften Liste schieben. Da die Liste jedoch keine Standarddaten zur Instanziierung enthält, was wäre der beste Weg, um einen Verweis auf den Stammknoten zu speichern?

In C, hätte ich nur einen Zeiger wie:

Node * root; 

Aber da Java-Zeiger nicht hat, würde eine einfache Erklärung, die wie:

Node root; 

... akzeptabel? Ich habe Java seit einiger Zeit nicht mehr verwendet, aber Speicher nicht einem Objekt zugewiesen, das als Klassenvariable deklariert ist und Speicherprobleme verursacht. Vielen Dank!

+1

Variablen speichern Werte. Für nicht-primitive Typen sind diese Werte (intern) "die Referenz" für das Objekt oder null. Ich bevorzuge es, den Begriff "Namen" zu verwenden, z. 'Knoten n1 = neuer Knoten(); Knoten n2 = n1; '-> der neue Knoten" wird durch "n1 und n2 (es ist das * gleiche * Knoten-Objekt) benannt, da beide Variablen dasselbe Objekt" auswerten ". Dieses Verhalten ähnelt den Zeigern in C/C++. Für nicht-primitive Typen gibt es * no * implizite Kopie/Duplizieren/Klonen auf einer Zuweisung (oder bei der Übergabe an eine Methode); das unterscheidet sich von Kopierkonstruktoren in C++. –

Antwort

3

Ja, eine einfache Deklaration wie Node root ist akzeptabel. Es ist eigentlich kein Zeiger, sondern eine Referenz, die sich möglicherweise auf eine beliebige Node beziehen kann.

Referenzen in Java sind konzeptionell äquivalent zu C-Zeigern, sind aber weniger flexibel und verwenden eine einfachere Syntax.

1

Ja,

Node root; 

ist akzeptabel. Jedes nicht-primitive Objekt (einschließlich Arrays von Primitiven oder Objekten) in Java ist eigentlich eine Referenz auf ein Objekt, also ist es in vielerlei Hinsicht wie ein C-Zeiger.

Es ist eigentlich so sehr wie ein Zeiger, dass diese Deklaration selbst nicht wirklich ein Objekt erstellt. Es ist eine Referenz, die noch auf nichts verweist, und wenn Sie versuchen, root zu verwenden, bevor Sie es zuerst einem new Node() zuweisen, erhalten Sie eine NullPointerException.

1

Ja, Node root; ist absolut in Ordnung. Stellen Sie sicher, dass Sie den Wert root nicht ändern. Um es zu verwenden, erstellen Sie eine andere Variable, um einen Pfad zu durchlaufen: Node start = root; Auf diese Weise bleibt root unberührt.

I haven't used Java in a while, but doesn't allocating memory to an object declared as a class variable cause potential memory issues? 

Nein, tut es nicht. Während einfach schreiben Node root; keinen Speicher reserviert, tut root = new Node();. Beachten Sie, dass class members in Java statisch sind, die nicht statischen Mitglieder sind global variables. Das Zuordnen von Speicher zu globalen Variablen in Java ist eine gängige Praxis. Beispielsweise wird die Variable, in der Sie die Liste tatsächlich speichern, wird eine globale Variable sein, und Sie müssen Speicherplatz zuweisen.

Java verfügt über ein robustes Speicherverwaltungssystem, sodass Sie Speicherproblemen nicht zu leicht begegnen.

Verwandte Themen