在研究链表实现时,我需要弄清楚在这种情况下,引用和对象是如何存储在堆栈和堆中的,在这种情况下,对象本身有引用,
public class MyLinkedList {
private Node head;
private int listCount;
public MyLinkedList() {
head = new Node("0");
listCount = 0;
}
public void add(Object data) {
Node nodeTemp = new Node(data);
Node nodeCurr = head;
while (nodeCurr.getNext() != null) {
nodeCurr = nodeCurr.getNext();
}
nodeCurr.setNext(nodeTemp);
listCount++;
}
}
public class LinkedListMain {
public static void main(String[] args) {
MyLinkedList ls = new MyLinkedList();
ls.add("1");
}
现在mylinkedlist对象被堆栈中的“ls”引用引用,而mylinkedlist本身也在堆中。我明白了。
但是当我们从mylinkedlist构造器创建新节点时,它通过“head”引用引用,“head”引用存储在哪里?我的疑问是,既然“node head”在(属于)mylinkedlist对象中,那么“head”是与“ls”一起存储在堆栈中,还是在mylinkedlist对象中?
3条答案
按热度按时间wnrlj8wa1#
您需要了解java的两个重要方面:
所有java对象都在java堆中分配。所有的。
在java中,变量永远不是对象。从未。但是变量可以是对对象的引用(或者变量可以是
int
,但这些也不是对象。)这意味着你的
main
方法分配MyLinkedList
对象,并将对该对象的引用存储在名为ls
. 那个MyLinkedList
对象(本身没有名称)可以存储对Node
对象(也将存储在java堆上)的本地字段中head
.没有任何其他对象被存储在任何对象的“内部”。其中只存储对其他对象的引用。
警告:虽然这个答案是正确的,但我认为java语言是如何工作的,只要你不能分辨出区别,运行时就可以进行各种优化。例如,“java堆”不是算法意义上的堆,甚至常常不是与“c++堆”相同的意义上的堆。javajit允许从一个类似栈的结构(younggen)甚至从当前栈(由于escape分析)分配java对象。也就是说,这些实现细节在您刚刚学习该语言时并不相关。
8fsztsew2#
main()中分配的“mylinkedlist”对象由“ls”引用ls“在堆栈上-main的局部变量。“mylistedlist”的这个示例的成员在堆上。在add()中,nodetemp和nodecurr是堆栈变量,它们是对节点的引用。节点本身在堆上。”head”是一个类成员变量,与listcount一起位于堆中。
在java中,(非静态)类成员必须始终在堆上。
hs1ihplo3#
所有示例变量和对象都存储在堆中。而局部变量在堆栈上。
head
将在堆上&ls
将在堆栈上。