Массив объектов в памяти

1

У меня мало основных вопросов по массивам.

  1. Рассмотрим, что я объявляю массив целых чисел

    int intArray[] = new intArray[10];
    intArray[0] = 10;
    intArray[1] = 20;
    // and so on...
    

Как intArray хранится в памяти (я имею в виду элементы массива)?

  1. Рассмотрим, что я объявляю массив объектов определенного типа, например 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 в памяти?

  • 0
    Java не является хорошим языком программирования, чтобы использовать и точно знать, что происходит в куче. На самом деле он делает все возможное, чтобы снять эту ответственность с программиста. Java управляет памятью от вашего имени, например, сборками мусора, распределением кучи и т. Д. Если вы хотите понять, что происходит «ближе к металлу», я предлагаю вам перейти на C или C ++.
Теги:
arrays
heap

2 ответа

0

Рассмотрим следующие изображения. Первое изображение показывает, как массив примитивных типов (байт, короткий, int, long, float, double, char, boolean) сохраняется в памяти.

Сам массив, являющийся объектом, запускается с использованием нового ключевого слова и выделяет некоторую память в куче. Но так как это массивы типов примитивов, они непосредственно хранят столько же значений примитивов, сколько и его размер. Эти значения устанавливаются в 0 (в случае массива примитивного типа int), если мы явно не изменим их с помощью команды, такой как intArray[0] = 10;

Изображение 174551

Однако в случае массива типа refence есть интересное различие. Самому массиву выделяется некоторое пространство памяти в куче после того, как оно было инициировано с использованием нового ключевого слова. Но он не сохраняет непосредственно объекты, но сохраняет ссылку на объекты, которые он удерживает. Эта ссылка будет нулевой или ссылкой (или адресом) на соответствующий объект где-то в памяти. Ссылка на каждый объект имеет значение по умолчанию null, если оно не изменено с помощью команды, аналогичной empArray[0] = new Employee(10, 20);

Что касается вашего последующего вопроса, в связанном списке, предположите, что я пытаюсь найти объект, расположенный в, пусть 11-й позиции, начиная с главы списка, мне придется повторить 10 раз, чтобы найти его. таким образом, размер и положение элемента в связанном списке будут влиять на время, необходимое для извлечения элемента. Однако в массиве мне просто нужно знать индекс, и он находит элемент в постоянное время.

Изображение 174551

0
  1. Массив int: будет блок памяти, который в 10 раз больше размера int, в котором хранятся значения.

  2. Массив Employee: будет блок памяти, который в 10 раз больше размера ссылки на объект, и каждый элемент будет ссылаться на объект Employee который находится где-то еще в памяти (или он будет null).

  • 0
    Спасибо за ответ,
  • 0
    У меня есть дополнительный вопрос по этому вопросу. Учитывая, что empArray будет иметь ссылку на объекты emp, созданные где-то в памяти. Чтобы извлечь объект из массива, скажем, empArray [1] будет выполнено в 2 этапа. 1. Проверьте ссылочный адрес, присутствующий в расположении empArray [1]
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню