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,但是没有为声明为类变量的对象分配内存会导致潜在的内存问题?谢谢!

4

3 回答 3

3

是的,一个简单的声明Node root是可以接受的。它实际上不是一个指针,而是一个可以潜在地引用任何Node.

Java 中的引用在概念上等同于 C 指针,但灵活性较差并且使用更简单的语法。

于 2012-04-03T22:29:13.797 回答
1

是的,Node root;绝对没问题。只要确保你不改变root. 为了使用它,创建另一个变量,用于遍历路径:Node start = root;这种方式root保持不变。

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?

不,它没有。虽然简单地写入Node root;不会分配任何内存,root = new Node();但确实如此。请注意,class members在 java 中是静态的,非静态成员是global variables. 在java中为全局变量分配内存是一种常见的做法。例如,您实际存储列表的变量是一个全局变量,您必须为其分配内存。

Java 具有强大的内存管理系统,因此您不会太容易遇到内存问题。

于 2012-04-03T22:47:23.510 回答
1

是的,

Node root;

是可以接受的。Java 中的每个非原始对象(包括原始数组或对象数组)实际上都是对对象的引用,因此它在很多方面都类似于 C 指针。

它实际上很像一个指针,这个声明本身并没有真正创建一个对象。它是一个还没有指向任何东西的引用,如果你root在将它分配给new Node()第一个之前尝试使用,你会得到一个NullPointerException.

于 2012-04-03T22:29:40.633 回答