Почему массив в Java является ссылочным типом?

«Почему массив в Java является ссылочным типом?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Массив в Java — это объект, размещаемый в куче (heap). Переменная массива хранит не сами данные, а ссылку (указатель) на область памяти, где эти данные расположены.

Ключевые следствия ссылочной природы:

  1. Передача по ссылке: При присваивании или передаче в метод копируется только ссылка, а не содержимое массива.
    int[] original = {1, 2, 3};
    int[] alias = original; // alias и original ссылаются на один массив
    alias[0] = 99;
    System.out.println(original[0]); // 99 — изменение видно через обе переменные
  2. Сравнение ссылок: Оператор == сравнивает адреса в памяти, а не содержимое.
    int[] a = {1, 2};
    int[] b = {1, 2};
    System.out.println(a == b); // false — разные объекты в куче
    System.out.println(Arrays.equals(a, b)); // true — сравнение по содержимому
  3. Значение null: Переменная массива может не ссылаться ни на какой объект.
    int[] empty = null;
    // empty[0] = 5; // NullPointerException

Почему так реализовано? Это позволяет эффективно работать с большими массивами (избегать копирования при передаче) и единообразно управлять памятью для всех объектов.