请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于 “ head = null;”的疑问

在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回答

liuyubobobo 2020-02-05 03:17:42

简单的来说,在 Java 语言中,除了基本数据类型(byte、short、int、long、float、double、boolean、char),其他的数据类型(类对象),全部是指针,但是,在 Java 中叫引用。


所以,Node prev = head 的意思是,创建了一个 Node 类型的引用,这个引用指向的空间,和 head 指向的空间是一样的。


也就是我的 ppt 动画中的箭头,这些箭头指向真正存储数据的内存空间。真正存储数据的内存空间,必须靠 new 开辟。

https://img1.sycdn.imooc.com//szimg/5e39c26c096a59e418781030.jpg


所以,如果你有 C/C++ 基础的话,你说的对,prev = head; 背后拷贝的是指针的值,而不是 Node 数据的值。head 本身指向一个内存位置,prev = head 将 head 指向的那个内存位置,拷贝给 prev,让 prev 指向同一个内存为止。


至于 head = null,就是将 0 拷贝给 head(在 C/C++ 中,即是给指针赋 0 值)。因为 0 不是一个合法的可以存储数据的内存地址,所以编译器可以判断出,head 不指向任何位置。


继续加油!:)

1 回复 有任何疑惑可以回复我~
  • 提问者 JunboWang0731 #1
    bobo老师讲的非常细致哈!非常感谢!另外附上详细讲解java中的“引用”与C/C++中“指针”关系的博客:“www.iteye.com/blog/zwmf-1738574”
    回复 有任何疑惑可以回复我~ 2020-02-05 18:56:32
  • liuyubobobo 回复 提问者 JunboWang0731 #2
    感谢分享:)
    回复 有任何疑惑可以回复我~ 2020-02-06 00:56:54
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号