Можно ли добавить null в коллекцию List в Java и какие могут быть последствия
Что проверяют
Знаете ли вы, что ответ зависит от реализации List, и понимаете ли, где null взорвётся не сразу, а через три вызова. Следом обычно спрашивают про List.of() и про сортировку списка с null.
Как отвечать
Сам интерфейс List не запрещает null, решает реализация:
ArrayList,LinkedList,Arrays.asList:nullдопускают, и сколько угодно раз;List.of()иList.copyOf(): бросаютNullPointerExceptionуже при создании. Подвох:List.of(...).contains(null)тоже бросает NPE, а не возвращаетfalse;- стримы:
Collectors.toList()иStream.toList()пропускаютnull, аCollectors.toUnmodifiableList()падает.
Методы самого ArrayList с null работают корректно: indexOf(null), contains(null) и remove(null) отдельно обрабатывают null, остальное сравнивают через equals. Проблемы начинаются в коде вокруг:
- разыменование:
list.get(i).length()илиmap(String::length)в стриме; - распаковка:
int x = numbers.get(0)на элементеnullдаёт NPE на присваивании, хотя строка выглядит безобидно; - сортировка:
Collections.sort(list)илиlist.sort(null)с естественным порядком упадёт наcompareTo. Решение:Comparator.nullsFirst(Comparator.naturalOrder()).
На практике null в коллекции почти всегда означает «значения нет», и эту неопределённость лучше убрать на входе: отфильтровать через Objects::nonNull, не класть элемент вовсе или взять объект по умолчанию. Optional как элемент коллекции не рекомендуют, он задуман для возвращаемых значений.
Где спотыкаются
Отвечают «нельзя, будет NPE», не различая ArrayList и List.of().
Уверены, что indexOf или remove с null ведут себя непредсказуемо. В ArrayList они полностью определены.
Забывают про автораспаковку: List<Integer> с null проходит компиляцию и тесты на счастливом пути, а падает в арифметике далеко от места, где null попал в список.