AI
prepair.app
Пройти інтерв'ю →
EnglishРусскийУкраїнська

питання на співбесіді Java розробника

Співбесіда Java-розробника охоплює семантику мови, колекції, багатопотоковість, Spring та вміння міркувати про JVM. Нижче — питання, які ставлять найчастіше, кожне з еталонною відповіддю.

Junior · без досвіду / до 1 рокуMiddle · 2–4 роки досвідуSenior · 5+ років досвіду

Що запитують

Core Java та ООП
Collections Framework
Багатопотоковість
Spring Boot і Spring Data
JVM, GC та памʼять
SQL і Hibernate

12 реальних питань з відповідями

До кожного питання — еталонна відповідь, з якою можна порівняти свою.

1

Як влаштований HashMap усередині і чим від нього відрізняється ConcurrentHashMap?

Відповідь

HashMap зберігає записи в масиві бакетів, індекс береться з хешу ключа; колізії складаються у звʼязний список, який після восьми вузлів перетворюється на червоно-чорне дерево. Він не потокобезпечний — одночасний ресайз може зіпсувати структуру. ConcurrentHashMap досягає потокобезпеки блокуванням лише того кошика, у який пишуть (CAS плюс synchronized на вузлі), а не всієї мапи, тому читання йдуть без блокувань, а записи конкурують лише в межах одного кошика.

2

Поясніть контракт equals() і hashCode(). Що ламається при його порушенні?

Відповідь

Якщо два обʼєкти рівні за equals(), вони зобовʼязані повертати однаковий hashCode; нерівні обʼєкти можуть збігатися за хешем, але в ідеалі не збігаються. Порушення ламає всі хеш-колекції: обʼєкт потрапляє в один бакет, а наступний пошук рахує інший хеш, іде в інший бакет і повідомляє, що запису немає. Класичний баг — змінити поле, що бере участь у hashCode, вже після додавання обʼєкта до множини.

3

Що таке garbage collection і які збирачі є в JVM?

Відповідь

GC звільняє памʼять купи для обʼєктів, до яких більше не можна дістатися від GC roots. Купа поколіннєва — більшість обʼєктів помирають молодими, тому мінорні збірки в young generation дешеві. Зі збирачів є Serial і Parallel для пропускної здатності, G1 як сучасний дефолт з балансом паузи та throughput, а також ZGC і Shenandoah для дуже великих куп із паузами менше мілісекунди.

4

У чому різниця між checked і unchecked винятками?

Відповідь

Checked успадковуються від Exception і мають бути оголошені або оброблені — вони описують відновлювані ситуації, до яких код-викликач має готуватися, наприклад IOException. Unchecked успадковуються від RuntimeException і сигналять про помилки програміста: NullPointerException, IllegalArgumentException. На практиці порада така: unchecked для багів, checked помірно, бо примус обробляти виняток у кожному виклику найчастіше породжує порожні catch-блоки.

5

Що таке Dependency Injection у Spring і які є типи інʼєкції?

Відповідь

DI означає, що обʼєкт отримує залежності від контейнера, а не створює їх сам, — це розвʼязує класи й робить їх тестованими. Spring підтримує інʼєкцію через конструктор, сетер і поле. Бажана конструкторна: залежності стають final, обʼєкт ніколи не існує в недобудованому вигляді, і клас не може приховати розростання списку залежностей так, як це дозволяє інʼєкція в поле.

6

У чому різниця між @Component, @Service, @Repository і @Controller?

Відповідь

Усі чотири реєструють клас як бін Spring і технічно взаємозамінні для сканування. Відрізняються наміром і тим, що Spring до них додає: @Repository транслює винятки персистентності в ієрархію DataAccessException, @Controller і @RestController беруть участь у маппінгу запитів, а @Service — семантична позначка бізнес-логіки. Використання конкретної анотації документує шар і вмикає потрібну поведінку.

7

Що таке транзакція? Поясніть рівні ізоляції.

Відповідь

Транзакція — це одиниця роботи, що задовольняє ACID: вона або цілком комітиться, або відкочується. Рівні ізоляції міняють консистентність на паралелізм: Read Uncommitted допускає брудні читання, Read Committed їх виключає, Repeatable Read додатково виключає неповторювані читання, Serializable прибирає й фантоми ціною пропускної здатності. Більшість систем працюють на Read Committed і закривають залишкові аномалії оптимістичними блокуваннями.

8

У чому різниця між ArrayList і LinkedList? Коли обрати кожен?

Відповідь

ArrayList спирається на розширюваний масив: доступ за індексом O(1), але вставка й видалення в середині зсувають елементи. LinkedList — двозвʼязний список: вставка й видалення біля відомого вузла O(1), зате доступ за індексом O(n), і кожен елемент несе накладні витрати вузла. На практиці ArrayList виграє майже завжди, бо локальність кешу процесора важливіша за теоретичну складність; LinkedList корисний переважно як Deque.

9

Що таке volatile і synchronized? Коли використовувати кожен?

Відповідь

volatile гарантує видимість — запис одразу видно іншим потокам, а читання не кешуються — але не дає атомарності, тому volatile-лічильник усе одно втрачає інкременти. synchronized дає і видимість, і взаємне виключення, тож блок у кожен момент виконує лише один потік. volatile беруть для простого прапорця, який читають багато потоків; synchronized або Atomic — коли операція це читання-зміна-запис.

10

Поясніть N+1 problem у Hibernate і як її уникнути.

Відповідь

N+1 виникає, коли ви одним запитом дістаєте N батьківських сутностей, а потім ліниво звертаєтесь до колекції у кожної, породжуючи N додаткових запитів. Зазвичай це виглядає як сторінка, що літає на трьох записах у тестах і намертво встає на трьох тисячах. Лікується JOIN FETCH у JPQL, entity graph, батчингом через @BatchSize або проєкцією, що вибирає рівно ті поля, які потрібні представленню.

11

У чому різниця між String, StringBuilder і StringBuffer?

Відповідь

String незмінний, тому кожна конкатенація створює новий обʼєкт — збірка рядка в циклі через + квадратична за часом. StringBuilder це змінюваний буфер і правильний інструмент для такого циклу. StringBuffer те саме, але з synchronized-методами; по суті це легасі, бо ділити змінюваний буфер між потоками доводиться рідко, і зазвичай усе одно потрібне грубіше блокування.

12

Що таке Stream API і коли його не варто застосовувати?

Відповідь

Stream описує операції над колекціями декларативно — як конвеєр лінивих проміжних операцій і термінальної, що запускає обчислення. Він добрий для фільтрації, перетворення та агрегації, бо намір лишається читабельним. Не варто застосовувати в гарячих циклах, де абстракція коштує вимірного часу, у логіці з побічними ефектами і там, де звичайний for читався б ясніше.

🦎

Прочитати відповіді недостатньо

На співбесіді ти говориш вголос під тиском. Кем поставить ті самі питання, оцінить кожну відповідь і покаже, що саме підтягнути.

Пройти інтерв'ю Java Backend →
Безкоштовно · 3 інтерв'ю на місяць

Інші спеціалізації

🔍QA Manual🤖QA Automation🐍Python Backend🐘PHP Backend🦫Go Backend🟢Node.js Backend⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing