Как хранятся статические массивы в памяти 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: ^ теперь в новом вопросе: Где хранятся переменные статического класса в памяти?
Ответы
Ответ 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, когда вы объявляете переменную как статическую, это переменная класса, а не переменная экземпляра.