Что такое массив в Java и каковы его основные характеристики?

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

Ответ

Массив в Java — это объект, который представляет собой контейнер фиксированной длины для хранения упорядоченной последовательности элементов одного типа.

Ключевые характеристики:

  • Фиксированный размер: Длина массива (length) задаётся при создании и не может быть изменена.
  • Индексация: Доступ к элементам осуществляется по целочисленному индексу, начиная с 0. Попытка доступа к индексу за пределами [0, length-1] вызывает ArrayIndexOutOfBoundsException.
  • Однородность: Все элементы массива должны быть одного типа (примитивного или ссылочного).
  • Память: Элементы располагаются в памяти последовательно, что обеспечивает быстрый доступ по индексу (O(1)).

Способы создания и инициализации:

// 1. Объявление и создание с последующим заполнением
int[] numbers = new int[5]; // Массив из 5 нулей (для примитивов - значения по умолчанию)
numbers[0] = 10;
numbers[1] = 20;

// 2. Объявление с одновременной инициализацией
int[] primes = {2, 3, 5, 7, 11};
String[] words = {"Hello", "World"};

// 3. Многомерные массивы (массивы массивов)
int[][] matrix = new int[2][3]; // 2 строки, 3 столбца
int[][] identity = {{1, 0}, {0, 1}}; // Инициализация

Важные особенности и методы:

  • Свойство length (не метод): int size = numbers.length;
  • Массивы — это объекты, наследуются от Object. Однако они не переопределяют toString(), equals() и hashCode(), что часто приводит к неочевидному поведению.
    int[] a = {1, 2};
    int[] b = {1, 2};
    System.out.println(a.equals(b)); // false! Сравниваются ссылки, а не содержимое.
    System.out.println(Arrays.equals(a, b)); // true - для сравнения содержимого используйте java.util.Arrays
  • Копирование массивов:
    int[] source = {1, 2, 3};
    int[] shallowCopy = source.clone(); // или Arrays.copyOf(source, source.length)

Когда использовать:

  • Когда размер коллекции известен заранее и не меняется.
  • Когда критически важна производительность при доступе по индексу.
  • Для работы с низкоуровневыми API, которые требуют массивов.

Альтернатива: Для динамических коллекций используйте ArrayList, LinkedList из Java Collections Framework.