В чем разница между Java Stream, Thread и Collection
Что проверяют
Не путаете ли вы три понятия, которые в русском языке сталкиваются лбами: «потоком» называют и Stream, и Thread. Интервьюер хочет услышать, что это вещи из разных плоскостей: хранение данных, их обработка и выполнение кода. Следом обычно спрашивают про parallelStream() и то, на каких потоках он работает.
Как отвечать
Начните с того, что сравнивать их напрямую нельзя, и разведите по назначению:
Collection: интерфейс изjava.util, корень иерархииList,Set,Queue. Хранит элементы в памяти, их можно перебирать сколько угодно раз и изменять, если реализация не неизменяемая.Mapв эту иерархию не входит, хотя относится к Collections Framework;Stream: конвейер операций над последовательностью элементов изjava.util.stream. Сам данные не хранит, берёт их из источника: коллекции, массива, генератора. Промежуточные операции (filter,map) ленивые и ничего не делают до терминальной (collect,forEach,count). Стрим одноразовый, повторный проход броситIllegalStateException;Thread: единица выполнения со своим стеком. С Java 21 есть виртуальные потоки (Thread.ofVirtual(),Executors.newVirtualThreadPerTaskExecutor()), которые дёшево создавать тысячами под блокирующий ввод-вывод.
Связь между ними: collection.stream() строит конвейер над коллекцией, а parallelStream() раскидывает работу по потокам общего ForkJoinPool.commonPool(). Здесь все три понятия и сходятся.
Упомяните, что InputStream из java.io к Stream API отношения не имеет, это поток байтов.
Где спотыкаются
Называют Collection классом и включают туда Map. Это интерфейс, а Map стоит отдельно и Collection не наследует.
Говорят, что стрим «быстрее цикла» и «идеален для больших объёмов». Последовательный стрим обычно не быстрее for, а параллельный выигрывает только на больших объёмах с дорогой операцией без блокировок, иначе накладные расходы на разбиение съедают пользу.
Считают, что parallelStream() создаёт свои потоки. Он использует общий пул, и блокирующая операция внутри тормозит все параллельные стримы приложения.