Подтвердить что ты не робот

Как хранятся статические массивы в памяти Java?

Таким образом, на языке, подобном C, память разделяется на 5 различных частей: ядро ​​ОС, текстовый сегмент, статическая память, динамическая память и стек. Что-то вроде этого:

Memory Layout

Если мы объявили статический массив в C, вам нужно было указать его размер заранее, после чего он будет исправлен навсегда. Программа выделила бы достаточно памяти для массива и ввела бы ее в сегмент статических данных, как ожидалось.

Однако я заметил, что в Java вы можете сделать что-то вроде этого:

public class Test {
        static int[] a = new int[1];

        public static void main( String[] args ) {
                a = new int[2];
        }
} 

и все будет работать так, как вы ожидали. Мой вопрос в том, почему это работает на Java?

EDIT: Таким образом, консенсус в том, что int[] в Java действует более похоже на int* в C. Так что в качестве последующего вопроса есть ли способ выделения массивов в статической памяти на Java (если нет, почему нет)? Разве это не обеспечит более быстрый доступ к таким массивам? EDIT2: ^ теперь в новом вопросе: Где хранятся переменные статического класса в памяти?

4b9b3361

Ответ 1

В java всякий раз, когда вы используете слово new, память для этого объекта выделяется в куче и возвращается ссылка. Это справедливо и для массивов. int[] a - это просто ссылка на new int[1]. Когда вы делаете new int[2], выделяется новый массив и указывается на a. Старый массив будет собирать мусор, когда это необходимо.

Ответ 2

Значение a - это просто ссылка на объект. Выражение создания массива (new int[2]) создает новый объект нужного размера и присваивает ссылку a.

Обратите внимание, что static в Java довольно раздельно для static в C. В Java это просто означает "связанный с типом, а не с каким-либо конкретным экземпляром типа".

Ответ 3

Вы создаете новый массив, не изменяя старый. Новый массив получит свое собственное пространство, и старый будет собираться с мусором (пока никто не ссылается на него).

Ответ 4

Я предполагаю, что когда вы имеете в виду "статическую память", вы имеете в виду кучу. В Java куча служит аналогичной цели для "статического сегмента данных", о котором вы упомянули. Куча - это место, где выделяется большинство объектов, включая массивы. С другой стороны, стек содержит объекты, которые используются только в течение жизни одного метода.

Ответ 5

В Java вы просто попросили, чтобы строго типизированная ссылка на массив хранилась статически для класса Test. Вы можете изменить то, что a означает во время выполнения, включая изменение размера. Это будет C-эквивалент статического хранилища int*.

Ответ 6

В Java переменная static существует как часть объекта класса. Подумайте об этом как переменной экземпляра для самого класса. В вашем примере a является ссылочной переменной, которая ссылается на некоторый массив (или вообще не массив, если он null), но сам массив выделяется, поскольку все массивы находятся в Java: от кучи.

Ответ 7

Статичность имеет другое значение в Java. В Java, когда вы объявляете переменную как статическую, это переменная класса, а не переменная экземпляра.