Распределение памяти для классов в Java - PullRequest
0 голосов
/ 02 октября 2018

Это рабочий код Java, который используется для реализации структуры данных Trie.

class TrieNode {
TrieNode[] arr;
boolean isEnd;
// Initialize your data structure here.
public TrieNode() {
    this.arr = new TrieNode[26];
}

Чего я не понимаю, так это как распределение памяти работает с

TrieNode[] arr;

кодом,Если бы это было что-то вроде этого

class TrieNode {
    int[] arr;
    boolean isEnd;
    // Initialize your data structure here.
    public TrieNode() {
        this.arr = new int[26];
    }

Я знаю, что это выделяет память для 26 целых чисел.Будет лучше, если вы сможете объяснить, как работает распределение памяти для первого кода.(С точки зрения компилятора)

EDIT: Извините, если мой вопрос неясен. Что я спрашиваю, мы создаем массив из 26 элементов в

new TrieNode[26];

Сколько памяти выделено?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Используя ваш первый код, когда вы создаете объект типа TriNode, такой как

TriNode t = new TriNode();

JVM выделит память для хранения 26 ссылок для элементов arr и 1 ссылки для поля isEnd.Для хранения ссылок JVM использует 32 бита для 32-битной JVM и 64 бита для 64-битной JVM.Когда вы создаете массив

new TrieNode[26];

, он будет выделять логическое значение 26 * (64-бит / 32-бит) +1, поскольку он не создает объекты TrieNode, а создает массив ссылок для хранения объектов TriNode, которые еще не созданы.Поэтому, когда вы инициализируете элементы массива, такие как

arr[0] = new TrieNode();

, тогда он будет выделять память для объекта TrieNode (), а arr [0] будет указывать на этот объект.

Итак, вывод заключается в том, что JVMне выделять память для 26 объектов Trinode, вместо этого он выделяет память для их ссылок.

0 голосов
/ 02 октября 2018

До тех пор, пока вы не вызовете new выделение памяти не будет сделано.

Таким образом, TrieNode[] arr; действует в качестве справочной информации в будущем.Только когда вы вызываете конструктор, Java выделяет память и устанавливает ссылку внутри arr.

Ссылки:

...