У меня есть объявление массива как это:
int a[];
Здесь a
массив примитива int
ввести. Где этот массив хранится? Это хранится на "куче" или стеке? Это - тип primitve int
, все типы примитивов не хранятся на "куче".
Это также может быть хорошо прочитано относительно незначительных различий в использовании: Linq Training Guide
-121--232456-В языке программирования Java массивы являются объектами, динамически создаются и могут быть назначены переменным типа Object.
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
-121--813911-Это массив примитивных типов, который сам по себе не является примитивным. Хорошее правило - когда задействовано новое ключевое слово, результат будет в куче.
В языке программирования Java массивы являются объектами, создаются динамически и могут быть присвоены переменным типа Object.
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Это будет сохранено На ходу
, потому что массив является объектом в Java.
Редактировать : Если у вас есть
int [] testScores;
testScores = new int[4];
Подумайте об этом коде, что говоря к компилятору, «Создать объект массива, который будет держать четыре INTS, и присвоить его в ссылочную переменную с именем Testscores
, Также идти вперед и установить каждый int
элемент до нуля. Спасибо. "
Как сказал гурукулки, он хранится в куче. Тем не менее, ваш пост предполагает недоразумение, вероятно, из-за того, что какой-то благонамеренный человек пропагандирует миф о том, что «примитивы всегда живут в стеке». Это неправда. Локальные переменные имеют свои значения в стеке, но не все примитивные переменные являются локальными ...
Например, рассмотрим следующее:
public class Foo
{
int value;
}
...
public void someOtherMethod()
{
Foo f = new Foo();
...
}
Теперь, где находится f.value
жить? Согласно мифу, он находится в стеке, но на самом деле он является частью нового объекта Foo
и живет в куче 1 .(Обратите внимание, что значение f
само по себе является ссылкой и находится в стеке.)
Отсюда легко перейти к массивам. Вы можете думать о массиве как о множестве переменных - так что new int [3]
немного похож на класс такой формы:
public class ArrayInt3
{
public readonly int length = 3;
public int value0;
public int value1;
public int value2;
}
1 На самом деле, это более сложно чем это. Различие стека / кучи в основном связано с реализацией - я считаю, что некоторые JVM, возможно, экспериментальные, могут определить, когда объект никогда не «ускользает» от метода, и могут выделить весь объект в стеке. Однако это концептуально в куче, если вы решите заботиться.