В Java есть несколько типов памяти, которые используются JVM (виртуальная машина Java) для управления выполнением программ Java. К ним относятся:

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

Память стека: это память, используемая JVM для хранения вызовов методов и локальных переменных. Каждый поток имеет свою собственную стековую память, которая используется для хранения кадров методов. При вызове метода новый фрейм помещается в стек, а когда метод возвращается, фрейм извлекается из стека.

Память области метода: это память, в которой JVM хранит данные уровня класса, такие как статические переменные, код метода и информацию о постоянном пуле. Эта память совместно используется всеми потоками в экземпляре JVM.

Собственная память: это память, используемая JVM для связи с собственной операционной системой. Сюда входит память, используемая JNI (собственный интерфейс Java) и другими системными библиотеками.

Управление памятью массива:
пока мы пишем это

int arr[];

Он генерирует только одну переменную в стеке, начальное значение которой равно null.

Однако, когда мы будем выделять оперативную память в будущем, вот так

arr=int[10];

Затем в куче выделяется пространство памяти для хранения 10 целых чисел. У них будет отдельный адрес. Предположим на данный момент, что адреса начинаются с 1000. Поскольку выделенные блоки памяти являются смежными, все они будут разделены одинаковым пространством. Предполагая 4 байта для хранения int, следующая ячейка памяти будет содержать 1004, за которой следуют 1008, 1012 и так далее. Кроме того, arr теперь будет содержать адрес первого блока или блока памяти среди этих смежных блоков или блоков памяти, который равен 1000.

Теперь, когда мы выполняем такие процедуры, как:

arr[9]=24;

Java интерпретирует это как arr -> 1000. Следовательно, Arr[0] — это 0 целых чисел от 1000. 1000 — это то. запутаться, да? Просто держись. Давайте исследуем arr[9].

Когда мы используем оператор [9], Java ищет 9-е место, которое находится в 9*4 = 36 байтах от 4000, то есть 4036. Это связано с тем, что Java рассматривает arr как 4000, потому что это значение хранится в стеке. . Следовательно, arr[9] — это блок памяти 4036. и это десятый блок. Надеюсь, к этому моменту вам стало ясно, почему индексация массива начинается с 0, а не с 1.