Отличия Arrays.asList() и List.of() в Java

Отличия между Arrays.asList() and List.of() в Java

Иногда в Java нам нужно создать небольшой список или преобразовать массив в список для удобства. Java предоставляет для этого несколько вспомогательных методов.

В этой статье мы сравним два основных способа инициализации коллекций: List.of() и Array.asList().

Использование Arrays.asList()


Метод Arrays.asList(), который является частью Java Collections Framework, введенный в Java 1.2, упрощает создание списков. Он может принимать массив в качестве входных данных и создавать фиксированный List объектов из предоставленного массива:

Integer[] array = new Integer[]{3, 5, 6, 7};
List<Integer> list = Arrays.asList(array);


Как видно, создать простой список целых чисел очень легко.

Неподдерживаемые операции в возвращаемом списке

Метод asList() возвращает список фиксированного размера. Следовательно, добавление и удаление новых элементов вызывает исключение UnsupportedOperationException:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
list.add(7);
list.remove(1);
// Exception in thread "main" java.lang.UnsupportedOperationException

Важно отметить, что список не создает копию входного массива. Вместо этого он оборачивает исходный массив с помощью интерфейса List. Следовательно, изменения в массиве отражаются и на списке:

Мы должны отметить, что список не создает копию входного массива. Вместо этого он оборачивает исходный массив с помощью интерфейса списка. Следовательно, изменения в массиве отражаются и на списке:

Integer[] array = new Integer[]{1,2,3,4};
List<Integer> list = Arrays.asList(array);
array[0] = 10;
// здесь list.get(0) == 10

Кроме того, список, возвращаемый Arrays.asList(), является изменяемым. То есть мы можем изменять отдельные элементы списка:

List<Integer> list = Arrays.asList(1, 2, 3);
list.set(1, 4);
// здесь list.get(1) == 4


В конечном счете, это может привести к нежелательным побочным эффектам, вызывающим ошибки, которые трудно обнаружить. Когда массив передается в качестве входных данных, изменение в списке также будет отражено и в массиве:

Integer[] array = new Integer[]{1, 2, 3};
List<Integer> list = Arrays.asList(array);
list.set(0, 5);
// здесь array[0] == 5

Давайте теперь посмотрим на другой способ создания списков.

Использование List.of()

В отличие от Arrays.asList(), Java 9 представила более удобный метод List.of(). Этот метод создает экземпляры неизменяемых списков:

String[] array = new String[]{"Java", "Python", "C#"};
List<String> list = List.of(array);

Отличия от Arrays.asList()

Основное отличие заключается в том, что List.of() возвращает неизменяемый список, который является копией входного массива. По этой причине изменения в исходном массиве не отражаются в возвращаемом списке:

String[] array = new String[]{"Java", "Python", "C#"};
List<String> list = List.of(array);
array[0] = "С++";
// здесь list.get(0) == "Java"

Кроме того, мы не можем изменять элементы списка. Если мы попытаемся это сделать, возникнет исключение UnsupportedOperationException:

String[] array = new String[]{"Java", "Python", "C#"};
List<String> list = List.of(array);
list.set(1, "C++");
// Exception in thread "main" java.lang.UnsupportedOperationException

Также нужно отметить, что List.of() не допускает значений null в качестве входных данных и вызовет исключение NullPointerException:

List.of("Hello", null, "World")
// Exception in thread "main" java.lang.NullPointerException

Заключение

В этой короткой статье мы рассмотрели создание списков в Java с использованием List.of() и Arrays.asList() и отличия в этих методах.


Онлайн обучение программированию на Java с нуля