在研究链表实现时,我需要澄清引用和对象如何存储在堆栈和堆中,以用于这种情况,其自身具有引用的对象,
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在堆中。我明白了。
但是当我们创建新的Node时,从MyLinkedList构造函数中引用" head"参考哪里"头"参考商店?我怀疑是因为" Node head"在MyLinkedList对象里面(属于)," head"存储在堆栈中与" ls" 或在MyLinkedList对象中是否有?
答案 0 :(得分:1)
您需要了解的有关Java的两个重要事项:
int
之类的原语,但这些也不是对象。)这意味着您的main
方法在Java堆上分配MyLinkedList
对象,并在名为{{1的变量中将引用存储到该对象}}。 ls
对象(它本身没有名称)可以将引用存储到本地的MyLinkedList
对象(也将存储在Java堆中)名为Node
的字段。
没有其他对象存储在任何对象的“内部”。只有引用才能存储在其他对象中。
警告:虽然这个答案是正确的,但我会考虑Java 语言的工作方式,只要您无法区分,运行时就可以进行各种优化。例如,“Java堆”在算法意义上不是堆,并且通常甚至与“C ++堆”的意义不同。允许Java JIT从类似堆栈的结构(younggen)或甚至从当前堆栈(由于转义分析)分配Java对象。也就是说,当您刚刚学习语言时,这些实施细节并不相关。
答案 1 :(得分:0)
" MyLinkedList"在main()中分配的对象是" ls"。 " LS"在堆栈上 - main的局部变量。 此实例的成员" MyListedList"在堆上。 在add()中,nodeTemp和nodeCurr是堆栈变量,它们是对节点的引用。节点本身在堆上。 "头"是一个类成员变量,并且与listcount一起位于堆上。
在Java中,(非静态)类成员必须始终在堆上。
答案 2 :(得分:0)
所有实例变量&对象存储在堆上。而局部变量在堆栈上。 head
将在堆上ls
将处于堆叠状态。
public class MyLinkedList {
private Node head;
private int listCount;
head
& listCount
两者都将在堆上。