Гарантирует ли метод Stream.toList() создание именно ArrayList в Java?

«Гарантирует ли метод Stream.toList() создание именно ArrayList в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, не гарантирует. Метод Stream.toList(), появившийся в Java 16, возвращает неизменяемый (unmodifiable) список. Его конкретная реализация (ListN) внутренняя и не является ArrayList.

Практические рекомендации:

  • Для получения классического, изменяемого ArrayList используйте Collectors.toCollection с явным указанием поставщика:
    List<String> list = stream.collect(Collectors.toCollection(ArrayList::new));
  • Метод Collectors.toList() (до Java 16) и в более новых версиях также не гарантирует возврат ArrayList. Его контракт лишь обещает "возвращать изменяемый список", но конкретная реализация (ArrayList или, например, Arrays.ArrayList) зависит от версии JDK и должно считаться деталью реализации.

Итог: Если в контракте метода или для последующей работы критически важен именно java.util.ArrayList, всегда используйте Collectors.toCollection(ArrayList::new).