我正在尝试用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,但是没有将内存分配给声明为类变量的对象导致潜在的内存问题?谢谢!
答案 0 :(得分:3)
是的,像Node root
这样的简单声明是可以接受的。它实际上不是指针,而是可以引用任何Node
的引用。
Java中的引用在概念上等同于C指针,但灵活性较低,并且使用更简单的语法。
答案 1 :(得分:1)
是,
Node root;
可以接受。 Java中的每个非原始对象(包括基元或对象的数组)实际上是对对象的引用,因此它在很多方面就像一个C指针。
它实际上非常像指针,这个声明本身并不是实际创建一个对象。它是一个未指向任何内容的引用,如果您在先将root
分配给new Node()
之前尝试使用NullPointerException
,则会获得{{1}}。
答案 2 :(得分: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();
会这样做。请注意,java中的class members
是静态的,非静态成员是global variables
。在java中将内存分配给全局变量是一种常见的做法。例如,实际存储列表的变量将是一个全局变量,将必须为其分配内存。
Java拥有强大的内存管理系统,因此您不会太容易遇到内存问题。