Вопросы с собеседований
Вопросы на собеседовании: Java
Java от junior до senior: ООП и основы языка, коллекции изнутри, многопоточность, JVM и GC, Stream API, паттерны.
267вопросов
78Junior
165Middle
24Senior
Основы языка
22- Что вернут сравнения для new String("a") и new String("a") через == и через equals()?Junior
- Integer a=127, b=127, c=128, d=128. Что вернут a==b и c==d?Junior
- Что означает final для переменной-ссылки?Junior
- Что верно про модификатор final в Java?Junior
- Что такое перегрузка метода (overloading)?Junior
- Чем String, StringBuilder и StringBuffer отличаются?Junior
- Реализуй метод reverse(String s), возвращающий строку в обратном порядке.Junior
- Сколько в Java примитивных типов и что хранит char?Junior
- Чему равно Integer.MAX_VALUE + 1 и бросит ли это исключение?Junior
- Что выведет System.out.println(0.1 + 0.2 == 0.3) и что брать для денег?Junior
- Что произойдёт при выполнении: Integer x = null; int y = x;?Junior
- Почему нельзя объявить List<int> и что пишут вместо этого?Junior
- Что происходит с примитивным аргументом, переданным в метод, если внутри метода его изменить?Junior
- Почему String в Java неизменяемый?Middle
- Почему int v = flag ? map.get(key) : 0 (map.get может вернуть null) способно бросить NPE?Middle
- Чем int[] на миллион чисел выгоднее List<Integer> того же размера?Middle
- Метод принимает StringBuilder и внутри выполняет sb.append("x"), а затем sb = new StringBuilder(). Что увидит вызывающий код?Middle
- У списка есть перегрузки remove(int index) и remove(Object o). Что сделает list.remove(1) для List<Integer>?Middle
- Что верно про varargs?Middle
- В каком порядке выполняется инициализация при создании объекта подкласса?Middle
- Что такое autoboxing и какие ловушки он приносит?Middle
- Библиотека объявляет public static final String VERSION = "1.0". В новой версии значение изменили на "2.0" и заменили только jar библиотеки. Что увидит уже скомпилированное приложение?Senior
ООП
14- Какие четыре принципа ООП?Junior
- Что даёт неизменяемость (immutability) объекта?Junior
- Сколько интерфейсов может реализовать один класс в Java?Junior
- Чем интерфейс отличается от абстрактного класса и что изменили default-методы?Middle
- Что требуется, чтобы класс был ПО-НАСТОЯЩЕМУ неизменяемым?Middle
- Конструктор сохранил переданный List по ссылке (this.items = items). Почему объект всё равно изменяем?Middle
- Почему про immutable-объект говорят «потокобезопасен без синхронизации»?Middle
- Как в immutable-дизайне моделируют «изменение» и снижают его цену?Middle
- Чего record НЕ делает за вас при проектировании неизменяемого носителя данных?Middle
- Почему java.util.Stack, унаследованный от Vector, считают ошибкой дизайна?Middle
- Класс сделал все поля private и добавил к каждому геттер и сеттер. Достигнута ли инкапсуляция?Middle
- Что верно про полиморфизм в Java?Middle
- Класс реализует два несвязанных интерфейса, в каждом из которых есть default-метод с одинаковой сигнатурой. Что произойдёт?Middle
- Ради чего в Java 8 добавили default-методы интерфейсов?Middle
Принципы проектирования
12- Что на самом деле утверждает Single Responsibility Principle?Junior
- Что означает принцип DRY?Junior
- В коде расчёта комиссии есть метод с цепочкой if по типу платежа, и при добавлении каждого нового способа оплаты приходится править этот метод и ещё три похожих. Какой принцип SOLID нарушен в первую очередь?Middle
- Что такое Liskov Substitution Principle и что обязан соблюдать подтип?Middle
- Сервис получает через конструктор зависимость типа PostgresOrderRepository (конкретный класс), которую внедряет Spring. Что здесь верно?Middle
- Что утверждает Interface Segregation Principle?Middle
- Два метода расчёта скидки — для розницы и для опта — сегодня содержат идентичный код, но правила задают разные владельцы и они уже расходились в прошлом. Что правильнее сделать?Middle
- Что верно про YAGNI?Middle
- Какой из фрагментов нарушает закон Деметры?Middle
- Что верно про связность (cohesion) и связанность (coupling)?Middle
- Что такое anemic domain model, чем она плоха и когда всё-таки допустима?Middle
- Доменный сервис работает с базой напрямую через JPA-репозиторий Spring Data. Как применить Dependency Inversion Principle, и что именно здесь «инвертируется»?Senior
Равенство, equals и hashCode
2Коллекции
45- Чем ArrayList отличается от LinkedList и что брать по умолчанию?Junior
- Чем HashSet, LinkedHashSet и TreeSet отличаются?Junior
- Что верно про иерархию Collections Framework?Junior
- Чем List отличается от Set?Junior
- Что лежит в основе ArrayList?Junior
- Сколько стоит получение элемента по индексу в LinkedList?Junior
- Как HashMap находит место для пары ключ-значение?Junior
- Что LinkedHashMap добавляет к обычной HashMap?Junior
- В каком порядке TreeMap отдаёт свои ключи при обходе?Junior
- Что произойдёт при добавлении в HashSet элемента, который там уже есть?Junior
- Чем очередь (FIFO) отличается от стека (LIFO)?Junior
- Для чего служит интерфейс Iterator?Junior
- Несколько потоков одновременно пишут в обычную HashMap. Чем это грозит?Junior
- Чем HashMap отличается от Hashtable и ConcurrentHashMap?Middle
- Что происходит в HashMap при коллизии ключей?Middle
- Чем Comparable отличается от Comparator и что значит согласованность порядка с equals?Middle
- Какое свойство LinkedHashMap отличает его от HashMap?Middle
- Почему стек реализуют через ArrayDeque, а не java.util.Stack?Middle
- В каком порядке выдаёт элементы итерация (for-each) по PriorityQueue?Middle
- Какая алгоритмическая сложность операций PriorityQueue (бинарной кучи)?Middle
- Нужна структура с быстрым поиском по ключу, которая при обходе отдаёт элементы в порядке их добавления. Что выбрать?Middle
- Что верно про неизменяемые и защитные коллекции?Middle
- Почему добавление в конец ArrayList считается амортизированно O(1), хотя иногда требует копирования всего массива?Middle
- Сколько стоит удаление элемента из середины ArrayList и почему?Middle
- Что верно про управление ёмкостью ArrayList?Middle
- Почему утверждение «вставка в середину LinkedList работает за O(1)» вводит в заблуждение?Middle
- Почему ArrayList обычно обходит LinkedList даже там, где асимптотика формально в пользу связного списка?Middle
- Нужна очередь FIFO внутри одного потока. Что выбрать по умолчанию?Middle
- Как получить LRU-кэш на базе LinkedHashMap?Middle
- Какой ценой LinkedHashMap поддерживает предсказуемый порядок обхода по сравнению с HashMap?Middle
- Что произойдёт при обходе LinkedHashMap, созданного с accessOrder = true, если во время итерации вызвать get() по существующему ключу?Middle
- Как устроен HashSet внутри?Middle
- В TreeSet добавили два объекта, для которых equals возвращает false, но компаратор считает их равными. Что произойдёт?Middle
- Объект добавили в HashSet, после чего изменили у него поле, участвующее в hashCode. Что теперь вернёт contains для этого же объекта?Middle
- В цикле for-each по списку вызывается list.remove(element). Что произойдёт?Middle
- Какие способы удалить элементы по условию во время обхода коллекции корректны?Middle
- Чем ListIterator отличается от обычного Iterator?Middle
- Нужно быстро находить ближайшую запись с ключом не больше заданного и выбирать все записи в диапазоне дат. Какая структура подходит?Middle
- Что произойдёт при попытке положить null-ключ в TreeMap?Middle
- Когда уместен CopyOnWriteArrayList?Middle
- Что верно про ёмкость и load factor в HashMap?Middle
- Почему ArrayDeque не допускает null-элементов?Middle
- Как выбираешь структуру данных под задачу? Проведи рассуждение на примере: нужно хранить сессии пользователей с быстрым поиском по id и обходом в порядке добавления.Middle
- Как устроен ConcurrentHashMap в Java 8+ и почему он эффективнее synchronized Map?Senior
- Чем fail-fast итератор отличается от weakly consistent?Senior
Исключения и ресурсы
9- Какой порядок catch-блоков корректен для FileNotFoundException и IOException?Junior
- Что происходит, если исключение не перехвачено ни в одном методе цепочки вызовов?Junior
- Что делает конструкция try-with-resources?Junior
- Чем checked-исключения отличаются от unchecked?Middle
- В try-with-resources исключение бросают и тело блока, и метод close(). Какое исключение получит вызывающий код?Middle
- Чем интерфейс AutoCloseable отличается от Closeable?Middle
- Код открывает соединение, затем в том же try создаёт из него statement, и оба объявлены в скобках try-with-resources. В каком порядке они закроются?Middle
- Что верно про иерархию Throwable?Middle
- Метод бросает исключение внутри try, а в блоке finally стоит return. Что получит вызывающий?Middle
Многопоточность
42- Чем Thread, Runnable и Callable отличаются?Junior
- Чем вызов start() у потока отличается от прямого вызова run()?Junior
- Что обеспечивает ключевое слово synchronized?Junior
- Что делает класс AtomicInteger?Junior
- Где должен располагаться вызов unlock() при работе с ReentrantLock?Junior
- Почему задачи отдают в пул потоков, а не создают поток на каждую?Junior
- Что представляет собой объект Future?Junior
- Что делает CountDownLatch?Junior
- Что даёт переменная типа ThreadLocal?Junior
- Чем виртуальный поток отличается от обычного платформенного?Junior
- Что гарантирует ключевое слово volatile для переменной?Middle
- Чем volatile отличается от synchronized?Middle
- В чём опасность ThreadLocal в пуле потоков?Middle
- Что такое deadlock и как его предотвращать?Middle
- Чем различаются CountDownLatch, CyclicBarrier и Semaphore?Middle
- Реализуй потокобезопасный счётчик Counter с методами increment() и get().Middle
- Какое ограничение Future решает CompletableFuture?Middle
- Чем thenCompose отличается от thenApply в CompletableFuture?Middle
- Поток пытается войти в synchronized-блок, занятый другим потоком. В каком состоянии он находится?Middle
- Что верно про прерывание потока через interrupt()?Middle
- Что верно про daemon-потоки?Middle
- Почему фабрики из класса Executors считают опасными в production-коде?Middle
- Сервис в основном ходит по сети: на каждую задачу примерно 90% времени — ожидание ответа и 10% — вычисления. Как выбрать размер пула потоков?Middle
- Задача, отправленная в пул через submit(), бросает RuntimeException, но в логах ничего нет. Почему?Middle
- Нужно ограничить число одновременных обращений к внешнему API десятью, не ограничивая при этом число рабочих потоков. Какой примитив подходит?Middle
- Можно ли переиспользовать CountDownLatch после того, как счётчик дошёл до нуля?Middle
- В коде вызывается semaphore.acquire(), затем работа с ресурсом, затем semaphore.release() в конце метода. Что здесь опасно?Middle
- Что верно про практическое применение виртуальных потоков?Middle
- Что происходит с виртуальным потоком, когда он выполняет блокирующий сетевой вызов?Middle
- Почему вызов wait() принято помещать в цикл while, а не в if?Middle
- На каких объектах не следует синхронизироваться?Middle
- Чем LongAdder выигрывает у AtomicLong при высокой конкуренции и в чём его ограничение?Middle
- Какие возможности даёт ReentrantLock, недоступные при использовании synchronized?Middle
- В parallel stream выполняется обращение к внешнему HTTP-сервису. Почему это опасно для всего приложения?Middle
- В каких случаях parallel stream, скорее всего, не даст выигрыша или окажется медленнее последовательного?Middle
- Чем различаются exceptionally, handle и whenComplete у CompletableFuture?Middle
- Два потока одновременно вызывают incrementAndGet() у одного AtomicInteger. Что при этом происходит внутри и почему ни один инкремент не теряется?Middle
- Что такое Fork/Join framework и work stealing?Senior
- Почему опасно выполнять блокирующие операции в стадиях CompletableFuture без явного Executor?Senior
- Что такое pinning виртуального потока и в каких случаях он всё ещё возможен в актуальных версиях Java?Senior
- Что такое ABA-проблема в алгоритмах на CAS?Senior
- Что даёт оптимистичное чтение в StampedLock и о каком его ограничении важно помнить?Senior
JVM и сборка мусора
27- Из каких основных областей состоит память JVM и что где хранится?Junior
- Чем отличаются JDK, JRE и JVM?Junior
- Где размещаются объекты, создаваемые оператором new?Junior
- Какие объекты удаляет сборщик мусора?Junior
- Что означает пауза stop-the-world при сборке мусора?Junior
- Чем слабая ссылка (WeakReference) отличается от обычной?Junior
- С чего правильно начинать настройку сборщика мусора?Junior
- Один поток в цикле читает обычное поле-флаг, другой его меняет, но цикл не завершается. Почему?Junior
- Что такое class loader и как работает делегирование загрузки классов?Middle
- Каков компромисс трёх базовых алгоритмов GC: mark-sweep, mark-compact, copying?Middle
- Что показывают метрики allocation rate и promotion rate?Middle
- Какие пары действий образуют отношение happens-before?Middle
- На какой гипотезе построено разделение кучи на поколения?Middle
- Зачем в молодом поколении две области Survivor, а не одна?Middle
- В приложении участились длинные паузы full GC, при этом старое поколение почти всегда заполнено. О чём это говорит?Middle
- Что верно про типы ссылок в Java?Middle
- Что относится к GC roots — корням достижимости?Middle
- Почему finalize() признан неудачным механизмом и что использовать вместо него?Middle
- Что верно про стек и кучу в JVM?Middle
- Java-приложение запускают в контейнере с лимитом памяти. Как правильно задать размер кучи?Middle
- Как выбрать сборщик мусора: Parallel, G1 или ZGC?Senior
- Что такое stop-the-world и safepoint в работе GC?Senior
- Почему в double-checked locking поле instance обязано быть volatile?Senior
- Один и тот же по имени класс загружен двумя разными загрузчиками. Что произойдёт при попытке присвоить объект одного типа переменной другого?Senior
- Почему увеличение кучи с 30 ГБ до 33 ГБ может уменьшить объём фактически доступной памяти?Senior
- Зачем при конкурентной маркировке сборщику нужны барьеры записи?Senior
- В проде выросли задержки, подозрение на GC. Опиши порядок диагностики — от сбора данных до вывода.Senior
Дженерики
13- Что такое generics в Java и зачем нужен wildcard ? extends / ? super?Junior
- Что дают дженерики при работе с коллекциями?Junior
- Что означает запись List<?> в сигнатуре метода?Junior
- Что означает стирание типов (type erasure)?Junior
- Почему List<String> нельзя присвоить переменной типа List<Object>?Middle
- Что можно делать со списком, объявленным как List<? extends Number>?Middle
- Метод должен перекладывать элементы из источника в приёмник. Какая сигнатура правильна по правилу PECS?Middle
- Что невозможно из-за стирания типов?Middle
- Зачем в сигнатуре пишут <T extends Comparable<T>>?Middle
- Чем опасно использование raw type, например List вместо List<String>?Middle
- Почему нельзя создать массив параметризованного типа (new List<String>[10] или new T[n])?Senior
- Когда корректно ставить @SafeVarargs на generic-varargs-метод?Senior
- Что такое bridge-метод в Java?Senior
Лямбды и Stream API
18- Для чего предназначен Optional?Junior
- Что такое функциональный интерфейс?Junior
- Что такое Stream в Java?Junior
- Что делает терминальная операция collect?Junior
- Чем промежуточные операции Stream отличаются от терминальных?Middle
- Как правильно использовать Optional?Middle
- Чем map, flatMap и filter отличаются в Stream API?Middle
- Чем this внутри лямбды отличается от this внутри анонимного класса?Middle
- Почему лямбда может захватывать только effectively final локальные переменные?Middle
- Чем collect отличается от reduce при сборке стрима?Middle
- Что произойдёт в Collectors.toMap, если два элемента дают одинаковый ключ, а merge-функция не передана?Middle
- Как одним коллектором получить «количество элементов в каждой группе»?Middle
- Зачем в JDK помимо Function<T,R> существуют IntFunction, ToIntFunction и IntPredicate?Middle
- Переменной присвоили Stream, вызвали count(), а затем на той же переменной вызвали forEach(). Что произойдёт?Middle
- В конвейере стоят filter и map. Почему порядок filter перед map обычно предпочтительнее обратного?Middle
- Функция значения в Collectors.toMap вернула null для одного из элементов. Что произойдёт?Middle
- Чем orElse отличается от orElseGet?Middle
- Какие способы применения Optional считаются антипаттернами?Middle
Дата и время
6- Почему java.time (Java 8) предпочитают старым Date/Calendar?Junior
- Что произойдёт при вызове date.plusDays(1) у объекта LocalDate?Junior
- Чем LocalDateTime отличается от ZonedDateTime?Middle
- Чем Instant и LocalDateTime отличаются и когда брать Duration, а когда Period?Middle
- Статическое поле SimpleDateFormat используется из нескольких потоков, и изредка возвращаются неверные даты. В чём причина и что делать?Middle
- В сервисе нужно сохранить момент оформления заказа и дату доставки, выбранную пользователем. Какие типы java.time возьмёшь и почему?Middle
Ввод-вывод и NIO
9- Какая пара классов преобразует байтовые потоки в символьные и обратно?Junior
- Чем байтовые потоки отличаются от символьных?Junior
- Что такое буфер (Buffer) в терминах NIO?Junior
- Чем IO отличается от NIO?Middle
- Что означают позиция, лимит и ёмкость у ByteBuffer, и что делает flip()?Middle
- Как виртуальные потоки изменили типичный выбор между блокирующим IO и неблокирующей моделью на Selector?Middle
- Почему чтение файла по одному байту через FileInputStream радикально медленнее, чем через BufferedInputStream?Middle
- Приложение читает файл через new FileReader(path) без указания кодировки. Чем это опасно?Middle
- Зачем нужны direct-буферы (ByteBuffer.allocateDirect) и в чём их минусы?Senior
Сериализация
5Паттерны проектирования
20- Какую задачу решают порождающие паттерны?Junior
- На каком приёме построено большинство структурных паттернов?Junior
- Что описывают поведенческие паттерны?Junior
- Чем Integer.valueOf(127) отличается от паттерна Factory Method по GoF?Middle
- Какие преимущества даёт статическая фабрика по сравнению с публичным конструктором?Middle
- Почему паттерн Builder особенно удобен при создании неизменяемых объектов?Middle
- Что отличает Abstract Factory от обычной фабрики?Middle
- Чем поверхностное копирование отличается от глубокого и как правильно копировать объекты в современной Java?Middle
- По какому признаку проще всего отличить Adapter от Decorator и Proxy?Middle
- Какой паттерн лежит в основе конструкции new BufferedInputStream(new GZIPInputStream(new FileInputStream(file)))?Middle
- Spring оборачивает бины в прокси, чтобы работали @Transactional и @Cacheable. Какие практические следствия из этого вытекают?Middle
- Что произойдёт при вызове add на списке, полученном из Arrays.asList(array)?Middle
- Какой паттерн реализуют SLF4J и JdbcTemplate по отношению к тому, что они скрывают?Middle
- Чем паттерн Proxy отличается от Decorator, если у обоих тот же интерфейс, что и у обёрнутого объекта?Middle
- Какой паттерн представляет java.util.Comparator?Middle
- В чём принципиальная разница между Template Method и Strategy?Middle
- Что верно про реализацию паттерна Observer в современной Java?Middle
- Какой паттерн реализуют цепочка сервлетных фильтров и фильтр-цепочка Spring Security?Middle
- State и Strategy структурно почти одинаковы. Что их различает?Middle
- Зачем нужен паттерн Visitor, какова его цена и чем его можно заменить в современной Java?Senior
Тестирование и логирование
6- Чем unit-тест отличается от integration-теста?Junior
- Зачем в логировании существуют уровни вроде DEBUG и ERROR?Junior
- Как написать модульный тест на JUnit 5?Junior
- Зачем нужны Maven и Gradle и как устроена сборка Java-проекта?Junior
- Почему в логировании предпочитают log.debug("user {} order {}", userId, orderId) вместо конкатенации строк?Middle
- Что такое паттерн Singleton и как сделать его потокобезопасным?Senior
Современная Java
12- Что верно про var (Java 10)?Junior
- Для чего предназначен record?Junior
- Что делает модификатор sealed у класса или интерфейса?Junior
- Что дают switch-выражения, text blocks и сопоставление с образцом в современной Java?Junior
- Чем switch-выражение (case L -> …) надёжнее старого switch?Middle
- Что верно про record в Java?Middle
- Когда record — неудачный выбор?Middle
- Что произойдёт, если объявить record с полем-массивом и сравнить два таких объекта с одинаковым содержимым массива?Middle
- Какое главное преимущество даёт sealed-иерархия при использовании switch с pattern matching?Middle
- Что обязан сделать наследник sealed-класса?Middle
- Что даёт pattern matching в instanceof по сравнению с классической проверкой?Middle
- Что такое текстовый блок и как в нём работают отступы?Middle
JIT и производительность
5
Партнёр платформы
Разбор собеседования
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.