База Java для первого собеседования — ООП, коллекции, исключения, основы языка.
- Какие четыре принципа ООП? Junior
Четыре принципа: инкапсуляция, наследование, полиморфизм, абстракция — к каждому короткий пример.
- Что вернут сравнения для new String("a") и new String("a") через == и через equals()? Junior
== даст false, equals() — true: == сравнивает ссылки, equals() у String — содержимое.
- Чем ArrayList отличается от LinkedList и что брать по умолчанию? Junior
ArrayList — динамический массив: доступ по индексу O(1), добавление в конец амортизированно O(1). LinkedList — двусвязный список: O(1) только при вставке или удалении у уже…
- Integer a=127, b=127, c=128, d=128. Что вернут a==b и c==d? Junior
a==b → true, c==d → false: Integer.valueOf() кэширует значения от −128 до 127.
- Для чего предназначен Optional? Junior
Optional — контейнер «значение или пусто», который явно говорит, что результата может не быть, и заставляет это обработать.
- Что означает final для переменной-ссылки? Junior
final у ссылки запрещает переприсваивание, но объект по ней менять можно.
- Из каких основных областей состоит память JVM и что где хранится? Junior
Куча (heap) — все объекты и массивы, общая для потоков, её чистит GC. Стек — у каждого потока свой: кадры вызовов с локальными переменными и ссылками. Metaspace — метаданные…
- Чем отличаются JDK, JRE и JVM? Junior
Вложенность: JVM исполняет байткод, JRE = JVM + стандартные библиотеки для запуска, JDK = JRE + инструменты разработки.
- Что верно про модификатор final в Java? Junior
final-класс нельзя наследовать (String, Integer), final-метод нельзя переопределить, final-переменная или поле присваивается ровно один раз. final-ссылка не делает объект…
- Какой порядок catch-блоков корректен для FileNotFoundException и IOException? Junior
Сначала FileNotFoundException, затем IOException: catch проверяются сверху вниз, и общий тип перед частным делает частный недостижимым — ошибка компиляции.
- Что такое generics в Java и зачем нужен wildcard ? extends / ? super? Junior
Дженерики — проверка типов на компиляции без приведений вручную. Wildcard: ? extends T — из коллекции читают как T (производитель), ? super T — в коллекцию пишут T (потребитель)…
- Чем Thread, Runnable и Callable отличаются? Junior
Thread — сам поток выполнения. Runnable — задача без результата (void run()), Callable<V> — задача с результатом V call(), которая может бросить проверяемое исключение.
- Что такое перегрузка метода (overloading)? Junior
Перегрузка (overloading) — несколько методов с одним именем и разными параметрами в одном классе; выбор на этапе компиляции по объявленным типам аргументов. Переопределение…
- Чем String, StringBuilder и StringBuffer отличаются? Junior
String неизменяем: каждая «правка» — новый объект. StringBuilder — изменяемый буфер, быстрый, не потокобезопасный. StringBuffer — то же, но с synchronized на каждом методе …
- Чем HashSet, LinkedHashSet и TreeSet отличаются? Junior
HashSet — без порядка, операции O(1); LinkedHashSet — помнит порядок вставки, O(1); TreeSet — отсортирован (красно-чёрное дерево), O(log n) и навигация: first, ceiling, subSet.
- Какая пара классов преобразует байтовые потоки в символьные и обратно? Junior
InputStreamReader декодирует байты в символы, OutputStreamWriter кодирует символы в байты. Кодировку указывают явно: new InputStreamReader(in, StandardCharsets.UTF_8).
- Чем unit-тест отличается от integration-теста? Junior
Unit-тест проверяет единицу логики изолированно: быстро, без БД и сети, зависимости заменены моками. Интеграционный проверяет связку компонентов с реальной инфраструктурой: БД…
- Реализуй метод reverse(String s), возвращающий строку в обратном порядке. Junior
Проще всего — new StringBuilder(s).reverse().toString(); вручную — обмен символов массива с двух концов.
- Сколько в Java примитивных типов и что хранит char? Junior
Примитивов восемь: byte, short, int, long, float, double, char, boolean; char — 16-битный беззнаковый, один UTF-16 code unit.
- Чему равно Integer.MAX_VALUE + 1 и бросит ли это исключение? Junior
Integer.MIN_VALUE, без исключения: целочисленная арифметика молча заворачивается по модулю 2³². 2147483647 + 1 = −2147483648.
- Что выведет System.out.println(0.1 + 0.2 == 0.3) и что брать для денег? Junior
false: 0.1 непредставимо точно в двоичной плавающей точке (IEEE 754), сумма даёт 0.30000000000000004. Для денег — BigDecimal из строки (new BigDecimal("0.1")) или копейки в long.
- Что произойдёт при выполнении: Integer x = null; int y = x;? Junior
NullPointerException: int y = x компилируется в x.intValue(), а вызов метода на null — NPE. Обёртка может быть null, примитив — нет.
- Почему нельзя объявить List<int> и что пишут вместо этого? Junior
Параметр дженерика может быть только ссылочным типом, поэтому пишут List<Integer> с автоупаковкой.
- Что такое функциональный интерфейс? Junior
Функциональный интерфейс — интерфейс ровно с одним абстрактным методом (SAM); лямбда и ссылка на метод — его реализация.
- Что верно про var (Java 10)? Junior
var — статический вывод типа компилятором из инициализатора; тип фиксируется при компиляции, динамики нет.
- Почему java.time (Java 8) предпочитают старым Date/Calendar? Junior
java.time (Java 8) неизменяем, потокобезопасен и с явной моделью: Instant, LocalDate, LocalTime, ZonedDateTime, Duration, Period. Date и Calendar изменяемы, месяцы с нуля…
- Что даёт неизменяемость (immutability) объекта? Junior
Неизменяемый объект потокобезопасен без синхронизации, безопасен как ключ Map / элемент Set и его можно свободно кэшировать и делить.
- Что на самом деле утверждает Single Responsibility Principle? Junior
SRP: у модуля одна причина для изменения — он отвечает перед одним актором (группой заинтересованных людей).
- Что верно про иерархию Collections Framework? Junior
Iterable → Collection → List, Set, Queue; Map — отдельная ветвь, не Collection: она хранит пары, а не элементы.
- Что происходит с примитивным аргументом, переданным в метод, если внутри метода его изменить? Junior
Ничего не произойдёт снаружи: Java всегда передаёт аргументы по значению, метод получает копию.
- Сколько интерфейсов может реализовать один класс в Java? Junior
Интерфейсов — сколько угодно, класс-родитель — только один.
- Что означает принцип DRY? Junior
DRY — Don't Repeat Yourself: каждое знание (правило, расчёт) должно быть записано в одном месте.
- Чем List отличается от Set? Junior
List — упорядоченная последовательность с дубликатами и доступом по индексу; Set — только уникальные элементы.
- Что лежит в основе ArrayList? Junior
В основе — массив, который при заполнении заменяется большим с копированием элементов (примерно в 1,5 раза).
- Сколько стоит получение элемента по индексу в LinkedList? Junior
O(n): произвольного доступа нет, до позиции нужно дойти по ссылкам (JDK начинает с ближнего конца).
- Как HashMap находит место для пары ключ-значение? Junior
По hashCode ключа вычисляется индекс корзины в массиве, внутри корзины ключи сравниваются через equals.
- Что LinkedHashMap добавляет к обычной HashMap? Junior
Предсказуемый порядок обхода — по умолчанию в порядке вставки — поверх той же хеш-таблицы.
- В каком порядке TreeMap отдаёт свои ключи при обходе? Junior
Всегда в порядке сортировки ключей — по естественному порядку (Comparable) или по переданному компаратору.
- Что произойдёт при добавлении в HashSet элемента, который там уже есть? Junior
Множество не изменится, а add вернёт false — удобная проверка «элемент новый?».
- Чем очередь (FIFO) отличается от стека (LIFO)? Junior
Очередь (FIFO) отдаёт элементы в порядке поступления, стек (LIFO) — начиная с последнего добавленного.
- Для чего служит интерфейс Iterator? Junior
Iterator даёт единый способ обойти коллекцию, не раскрывая её устройства: hasNext() и next().
- Несколько потоков одновременно пишут в обычную HashMap. Чем это грозит? Junior
HashMap не потокобезопасен: параллельная запись ломает структуру — потерянные записи, неверный size, в старых версиях — зависание обхода.
- Что происходит, если исключение не перехвачено ни в одном методе цепочки вызовов? Junior
Исключение поднимается вверх по стеку вызовов до первого подходящего catch; если его нет — поток завершается со стектрейсом.
- Что делает конструкция try-with-resources? Junior
try-with-resources гарантированно закрывает ресурсы при любом выходе из блока — без ручного finally.
- Чем вызов start() у потока отличается от прямого вызова run()? Junior
start() создаёт новый поток, и уже он вызывает run(); прямой run() выполняется в текущем потоке, как обычный метод.
- Что обеспечивает ключевое слово synchronized? Junior
synchronized даёт взаимное исключение (один поток в блоке по данному монитору) и видимость изменений для следующего вошедшего.
- Что делает класс AtomicInteger? Junior
AtomicInteger выполняет операции вроде инкремента атомарно без блокировок — на аппаратной инструкции CAS (сравнение с обменом).
- Где должен располагаться вызов unlock() при работе с ReentrantLock? Junior
unlock() — в finally, а lock() — перед try: иначе исключение в критической секции оставит замок захваченным навсегда.
- Почему задачи отдают в пул потоков, а не создают поток на каждую? Junior
Пул переиспользует потоки и ограничивает их число: создание потока дорого, а неограниченный рост убивает приложение.
- Что представляет собой объект Future? Junior
Future — ссылка на результат, который появится позже: можно проверить готовность, дождаться значения или отменить задачу.
- Что делает CountDownLatch? Junior
CountDownLatch — защёлка на счётчике: потоки ждут в await(), пока другие не уменьшат счётчик до нуля через countDown().
- Что даёт переменная типа ThreadLocal? Junior
ThreadLocal — своя ячейка значения для каждого потока: синхронизация не нужна, потому что значение никто не разделяет.
- Чем виртуальный поток отличается от обычного платформенного? Junior
Виртуальный поток — лёгкий поток под управлением JVM, а не ОС: создание и блокировка стоят копейки, их можно держать миллионами.
- Где размещаются объекты, создаваемые оператором new? Junior
Объекты — в куче, общей для всех потоков; в стеке потока — кадры вызовов с локальными переменными, в том числе ссылками на объекты.
- Какие объекты удаляет сборщик мусора? Junior
Удаляются недостижимые от корней объекты: сборщик обходит граф ссылок от GC roots, всё, до чего не дошёл, — мусор.
- Что означает пауза stop-the-world при сборке мусора? Junior
Stop-the-world — все потоки приложения приостанавливаются, пока сборщик выполняет часть работы; эти паузы и стараются сокращать.
- Чем слабая ссылка (WeakReference) отличается от обычной? Junior
Слабая ссылка позволяет обратиться к объекту, но не удерживает его от сборки: если обычных ссылок нет, объект соберут.
- С чего правильно начинать настройку сборщика мусора? Junior
Начинать с измерений: включить логи GC и понять, в чём проблема — длинные паузы, частые сборки или рост живых данных.
- Один поток в цикле читает обычное поле-флаг, другой его меняет, но цикл не завершается. Почему? Junior
Проблема видимости: без синхронизации нет гарантии, что поток увидит изменение, сделанное другим, — нужен volatile или синхронизация.
- Что дают дженерики при работе с коллекциями? Junior
Дженерики переносят проверку типов на этап компиляции и убирают ручные приведения при чтении.
- Что означает запись List<?> в сигнатуре метода? Junior
List<?> — список неизвестного типа: читать можно как Object, добавлять нельзя ничего, кроме null.
- Что означает стирание типов (type erasure)? Junior
Стирание типов: компилятор проверяет типы, но в байткоде параметр заменяется границей (обычно Object) — в рантайме его нет.
- Что такое Stream в Java? Junior
Stream — конвейер обработки элементов источника: данные не хранит и источник не меняет.
- Что делает терминальная операция collect? Junior
collect — терминальная операция, которая складывает результат конвейера в структуру: список, множество, карту, строку.
- Что произойдёт при вызове date.plusDays(1) у объекта LocalDate? Junior
Вернётся новый объект, исходный не изменится — все типы java.time неизменяемы.
- Чем байтовые потоки отличаются от символьных? Junior
Байтовые потоки (InputStream/OutputStream) — для любых двоичных данных, символьные (Reader/Writer) — для текста и учитывают кодировку.
- Что такое буфер (Buffer) в терминах NIO? Junior
Buffer — область памяти фиксированного размера, через которую данные читаются из канала и пишутся в него.
- Что такое сериализация? Junior
Сериализация — преобразование объекта в байты для передачи или хранения и обратное восстановление.
- Какую задачу решают порождающие паттерны? Junior
Порождающие паттерны отделяют клиента от конкретных классов создаваемых объектов: создание прячут за фабрикой или билдером.
- На каком приёме построено большинство структурных паттернов? Junior
Структурные паттерны построены на композиции и делегировании: объект хранит ссылку на другой и пропускает вызовы через себя.
- Что описывают поведенческие паттерны? Junior
Поведенческие паттерны описывают, как объекты распределяют обязанности и взаимодействуют.
- Зачем в логировании существуют уровни вроде DEBUG и ERROR? Junior
Уровни нужны, чтобы фильтровать записи по важности: в продакшене — только значимое, подробности — для отладки.
- Для чего предназначен record? Junior
record — компактный неизменяемый носитель данных: поля в заголовке, а конструктор, аксессоры, equals, hashCode и toString создаёт компилятор.
- Что делает модификатор sealed у класса или интерфейса? Junior
sealed ограничивает список наследников: наследовать или реализовывать могут только перечисленные в permits типы.
- Что делает JIT-компилятор в JVM? Junior
JIT компилирует часто выполняемые участки байткода в машинный код прямо во время работы программы.