2015-04-28 3 views
0

при изучении реализации связанного списка, мне нужно разъяснить, как ссылка и объект хранить в стеке и куче для такого рода сценария, при котором объекте это сам имеют ссылки,Хранения ссылок на объекты внутри объекта в модели памяти 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 - это куча. Это я понял.

Но тогда из конструктора MyLinkedList, когда мы создаем новый узел, который ссылается на ссылку «head», где находится этот «главный» справочный магазин? Мое сомнение в том, что «Узел головы» находится внутри объекта MyLinkedList (принадлежит), «хранит» хранилище в стеке с «ls»или это вид внутри объекта MyLinkedList?

+0

глава является ссылкой узла. Является ли Node определяемым пользователем классом? –

+0

Определенный пользователем класс – Harshana

ответ

1

Два важных вещей, о Java вы должны понять:

  1. Все Java объектов выделяются в куче Java. Все они.
  2. В Java, переменные являются never объектов. Никогда. Но переменная может быть ссылкой на объект. (Или переменная может быть примитивной, как int, но это также не объекты.)

Что это означает, что ваш метод main выделяет MyLinkedList объект, на куче Java, и сохраняет ссылку на этот объект в переменной с именем ls. То, что объект MyLinkedList (который сам не имеет имени) может хранить ссылку объекту Node (который также будет храниться на куче Java) в локальном поле с именем head.

Ни один другой объект не хранится «внутри» какого-либо объекта. Только ссылки на другие объекты хранятся внутри.

Предостережение: Хотя этот ответ правильный, я рассматриваю, как работает язык Java , среда выполнения позволяет делать различные оптимизации, пока вы не можете отличить эту разницу. Например, «куча Java» не является кучей в алгоритмическом смысле и часто даже не в том же смысле, что и «куча C++». Java JIT позволяет выделять объекты Java из стекообразной структуры (младшего) или даже из текущего стека (из-за анализа escape-кода). Тем не менее, эти детали реализации не актуальны, когда вы просто изучаете язык.

0

Объект «MyLinkedList», выделенный в main(), ссылается на «ls». «ls» находится в стеке - локальная переменная main. Члены этого экземпляра «MyListedList» находятся в куче. В add(), nodeTemp и nodeCurr являются переменными стека, которые являются ссылками на узлы. Сами узлы находятся в куче. «head» - это переменная класса, и находится в куче, наряду с listcount.

В Java члены класса (нестатические) всегда должны находиться в куче.

+0

как для примитивных, так и для ссылочных статических классов? – Harshana

+0

Статические члены класса (примитивы) не находятся в стеке. Они выделяются при запуске программы. Я не знаю конкретно, находятся ли они в куче или части образа программы (как в C), но это не имеет большого значения. Важно понимать разницу между ссылкой на объект и сам объект. Ссылка может иметь значение «null» или быть ссылкой на объект. Объекты всегда доступны через ссылку - поэтому «static Object foo» - хранилище самой ссылки («foo») статично, но любой объект, который он ссылается, всегда будет находиться в куче. – joeking

+0

Кроме того, объем памяти, необходимый для хранения ссылки, примерно такой же, как размер целого. В зависимости от вашего устройства он обычно будет 4 или 8 байтов. Размер объекта зависит от его нестатических элементов (плюс небольшое количество накладных расходов). Таким образом, для объекта с 500 int членами потребуется около 4 * 500 = 2000 байт памяти. – joeking

0

Все переменные экземпляра & объекты хранятся в куче. В то время как локальные переменные находятся в стеке. head будет на куче & ls будет на стеке.

public class MyLinkedList { 

    private Node head; 
    private int listCount; 

head & listCount как будет на куче.

+0

Итак, под средними переменными экземпляра вы подразумеваете членов класса правильно? Таким образом, head & listCount будут находиться в куче и локальной переменной для метода add, nodeTemp и nodeCurr в стеке – Harshana

+0

yes, Внутри виртуальной машины Java каждому потоку присуждается стек Java, который содержит данные, к которым ни один другой поток не может получить доступ, включая локальные переменные, параметры и возвращаемые значения каждого метода, вызванного потоком. Данные в стеке ограничены примитивными типами и ссылками на объекты. В JVM невозможно поместить изображение фактического объекта в стек. Все объекты находятся в куче. – underdog

Смежные вопросы