Вопросы собеседований: методы интерфейса 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 неизменяемость тоже в приоритете♥️