У меня мало основных вопросов по массивам.
Рассмотрим, что я объявляю массив целых чисел
int intArray[] = new intArray[10];
intArray[0] = 10;
intArray[1] = 20;
// and so on...
Как intArray
хранится в памяти (я имею в виду элементы массива)?
Рассмотрим, что я объявляю массив объектов определенного типа, например Employee
class Employee {
int x = 10;
int y = 20;
Employee(int x, int y) {
this.x = x;
this.y = y;
}
}
class TestEmployee {
public void main(String args[]) {
Employee empArray = new Employee[10];
empArray[0] = new Employee(10, 20);
empArray[1] = new Employee(30, 40);
...
}
}
Как выглядит empArray
в памяти?
Рассмотрим следующие изображения. Первое изображение показывает, как массив примитивных типов (байт, короткий, int, long, float, double, char, boolean) сохраняется в памяти.
Сам массив, являющийся объектом, запускается с использованием нового ключевого слова и выделяет некоторую память в куче. Но так как это массивы типов примитивов, они непосредственно хранят столько же значений примитивов, сколько и его размер. Эти значения устанавливаются в 0 (в случае массива примитивного типа int), если мы явно не изменим их с помощью команды, такой как intArray[0] = 10;
Однако в случае массива типа refence есть интересное различие. Самому массиву выделяется некоторое пространство памяти в куче после того, как оно было инициировано с использованием нового ключевого слова. Но он не сохраняет непосредственно объекты, но сохраняет ссылку на объекты, которые он удерживает. Эта ссылка будет нулевой или ссылкой (или адресом) на соответствующий объект где-то в памяти. Ссылка на каждый объект имеет значение по умолчанию null, если оно не изменено с помощью команды, аналогичной empArray[0] = new Employee(10, 20);
Что касается вашего последующего вопроса, в связанном списке, предположите, что я пытаюсь найти объект, расположенный в, пусть 11-й позиции, начиная с главы списка, мне придется повторить 10 раз, чтобы найти его. таким образом, размер и положение элемента в связанном списке будут влиять на время, необходимое для извлечения элемента. Однако в массиве мне просто нужно знать индекс, и он находит элемент в постоянное время.
Массив int
: будет блок памяти, который в 10 раз больше размера int
, в котором хранятся значения.
Массив Employee
: будет блок памяти, который в 10 раз больше размера ссылки на объект, и каждый элемент будет ссылаться на объект Employee
который находится где-то еще в памяти (или он будет null
).