Java: Массивы

Теория: Модификация

Примитивные типы данных, с которыми мы работали до сих пор, невозможно изменить. Любые функции и методы над ними возвращают новые значения, но не могут ничего сделать со старым.

var name = "Hexlet";
name.toUpperCase(); // "HEXLET"
// Значение name не поменялось
System.out.println(name); // => Hexlet

С массивами это правило не работает. Элементы массива можно изменять, записывая туда другие значения. Синтаксис изменения элемента массива практически такой же, как и при обращении к элементу массива. Разница лишь в наличии присваивания:

import java.util.Arrays;

String[] animals = { "cats", "dogs", "birds" };
// Меняется первый элемент массива
animals[0] = "horses";
System.out.println(Arrays.toString(animals));
// => [horses, dogs, birds]

// Если индекса не существует, то получим ошибку
animals[5] = "monkeys";
| Exception java.lang.ArrayIndexOutOfBoundsException:
| Index 5 out of bounds for length 3

Точно так же можно инициализировать новый массив:

// Создается массив из 5 чисел
int[] numbers = new int[5];

// Порядок заполнения не важен
numbers[1] = 8;
numbers[0] = 3;

Созданный, но не инициализированный массив наполняется значениями по умолчанию. Для каждого типа это свое значение:

boolean : false int : 0 double : 0.0 String : null

Например, для строк:

String[] cars = new String[2];
System.out.println(cars[0]); // => null

Изменение размера массива

Массивы в Java имеют фиксированную длину. Это связано с тем, как хранятся массивы в памяти. Каждый раз когда нужно изменить размер массива, что-то добавить или удалить, придется создавать новый массив куда копируются нужные значения из старого. В следующих уроках мы рассмотрим как конкретно это происходит, а сейчас поработаем уже с готовыми методами. Обработка массивов хорошо реализована в библиотеке Apache Commons Lang.

import org.apache.commons.lang3.ArrayUtils;
import java.util.Arrays;

String[] animals = { "cats", "dogs", "birds" };

// Добавление элементов

var animals2 = ArrayUtils.add(animals, "horse");
System.out.println(Arrays.toString(animals2));
// => [cats, dogs, birds, horse]

// Исходный массив не поменялся
System.out.println(Arrays.toString(animals));
// => [cats, dogs, birds]

// Удаление элементов

// Удаляем элемент с index = 1
var animals3 = ArrayUtils.remove(animals, 1);
System.out.println(Arrays.toString(animals3));
// => [cats, birds]

// Удаляем элемент с index = 0
var animals4 = ArrayUtils.remove(animals, 0);
System.out.println(Arrays.toString(animals4));
// => [dogs, birds]