关于 “ head = null;”的疑问
来源:4-2 在链表中添加元素
JunboWang0731
2020-02-04
在LinkedList的构造方法中:
public LinkedList() {
head = null;
size = 0;
}
在这里,head是LinkedList类中的成员变量,并且head本身也是Node类的一个对象。
按照我的理解,head = null 是将head对象不指向任何对象。但是head对象和null是如何通过“=”实现这一目的的呢?
同样的困惑还来自于LinkedList的add方法:
public void add(int index, E e)
{
...
else{
Node prev = head;
for(int i = 0; i < index - 1; i++)
prev = prev.next;
}
...
}
在这里寻找要插入元素的过程中,需要将prev替换为prev所指向的下一个Node对象,这里“=”将两个Node对象进行的是拷贝操作吗,那么拷贝的是“指针”还是什么东西?
本人没有Java基础,用了一些其他计算机语言中的“指针”概念,但这对我理解Java实现链表非常重要,请bobo老师见谅!
1回答
-
简单的来说,在 Java 语言中,除了基本数据类型(byte、short、int、long、float、double、boolean、char),其他的数据类型(类对象),全部是指针,但是,在 Java 中叫引用。
所以,Node prev = head 的意思是,创建了一个 Node 类型的引用,这个引用指向的空间,和 head 指向的空间是一样的。
也就是我的 ppt 动画中的箭头,这些箭头指向真正存储数据的内存空间。真正存储数据的内存空间,必须靠 new 开辟。
所以,如果你有 C/C++ 基础的话,你说的对,prev = head; 背后拷贝的是指针的值,而不是 Node 数据的值。head 本身指向一个内存位置,prev = head 将 head 指向的那个内存位置,拷贝给 prev,让 prev 指向同一个内存为止。
至于 head = null,就是将 0 拷贝给 head(在 C/C++ 中,即是给指针赋 0 值)。因为 0 不是一个合法的可以存储数据的内存地址,所以编译器可以判断出,head 不指向任何位置。
继续加油!:)
122020-02-06
相似问题