October 4, 2020

Вопросы собеседований: методы интерфейса List (Java 10)

Какой код при вставке в указанную область напечатает в консоли:

Latest version 15 on 6.10.2020

Варианты ответов:

В общем, нам нужен такой код, который допускает изменение текущих элементов и добавление новых.

A. List.of("Latest", "version", "14");

Создаёт неизменяемый список, в котором методы add, set, remove бросают UnsupportedOperationException.

Этот вариант не подойдёт.

B. String[] array = {...};
   List<String> list = new ArrayList(array);

У ArrayList и LinkedList нет конструктора, принимающего массив.

Результат — ошибка компиляции.

C. String[] array = {...};
   List<String> list = Arrays.asList(array);

Здесь создаётся структура, известная как Array backed list: элементы хранятся как массив, но используются методы интерфейса List.

У массива размер задаётся при создании и не может меняться. Операции add, remove, clear выбросят UnsupportedOperationException.

Менять можно только существующие элементы: методы set, replaceAll, sort.

Этот вариант тоже мимо.

D. List<String> arrList = new ArrayList<>() {{...}};
   List<String> list = List.copyOf(arrList);

Метод из java 10 copyOf даёт неизменяемую копию переданного списка. Если входная коллекция и так неизменяемая, возвращается она же.

Методы add, set и остальные бросают UnsupportedOperationException.

Итого:

Везде используется интерфейс List, но по факту данные хранятся в массиве. Некоторые варианты позволяют обновлять существующие элементы, но добавлять и удалять элементы нельзя. Поэтому правильный ответ — F: ни один вариант не подойдёт.


Лирическое отступление: тренды и дизайн методов

Когда я первый раз увидела конструкцию

List.of("1", "2");

то подумала, что это краткая форма записи обычного изменяемого списка:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");

Это логично, потому что java - ООП язык. Объекты представляют реальный мир и меняют свойства в зависимости от действий и условий.

Но сейчас идёт тренд на функциональный стиль: на первом плане не взаимодействие объектов, а обработка данных. Их нужно беречь и держать неизменными, это прослеживается во многих новых фичах: Stream API, Records и другие.

И в новых методах интерфейса List неизменяемость тоже в приоритете♥️