Как статические массивы хранятся в памяти Java? - PullRequest
19 голосов
/ 11 июля 2011

Таким образом, на языке, подобном 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?

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

Ответы [ 7 ]

17 голосов
/ 11 июля 2011

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

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

11 голосов
/ 11 июля 2011

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

6 голосов
/ 11 июля 2011

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

4 голосов
/ 11 июля 2011

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

2 голосов
/ 11 июля 2011

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

2 голосов
/ 11 июля 2011

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

1 голос
/ 11 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...