在Java内存模型中的对象内存储对象引用

时间:2015-04-28 05:07:50

标签: java

在研究链表实现时,我需要澄清引用和对象如何存储在堆栈和堆中,以用于这种情况,其自身具有引用的对象,

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对象中是否有

3 个答案:

答案 0 :(得分:1)

您需要了解的有关Java的两个重要事项:

  1. 所有 Java 对象都在Java堆中分配。所有这些。
  2. 在Java中,变量从不对象。决不。但是变量可以是对象的引用。 (或者变量可以是int之类的原语,但这些也不是对象。)
  3. 这意味着您的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两者都将在堆上。