Treść strony
RekrutacjeIt

Pytania rekrutacyjne Java, 30 pytań z oczekiwanymi odpowiedziami

Pytania rekrutacyjne Java sprawdzają trzy rzeczy: znajomość języka i maszyny wirtualnej, umiejętność pracy z kolekcjami i współbieżnością oraz praktykę w ekosystemie, czyli Spring, bazy danych i testy. Poniżej zebraliśmy 30 pytań pogrupowanych w sekcje, ze zwięzłą odpowiedzią, której oczekuje rekruter lub lider zespołu. Odpowiedzi są skrótem, a nie ściągą do wykucia: na rozmowie warto dopytać o przykład z realnego projektu, bo to on odróżnia zrozumienie od znajomości terminów.

Do czego służą pytania i czego nie sprawdzają

Lista nadaje się do przygotowania pierwszej rozmowy technicznej na poziomie mid i do powtórki przed rozmową dla kandydatów. Pytania z podstaw języka wystarczą do wstępnej weryfikacji, natomiast poziom senior wymaga dalszych pytań o projektowanie systemów, wydajność i decyzje architektoniczne. Rekruter bez zaplecza programistycznego może użyć odpowiedzi jako punktu odniesienia: jeśli kandydat obejmuje podane elementy własnymi słowami, rozumie temat. Jeśli powtarza definicję bez przykładu, warto dopytać.

Pytania 1 do 8

1. Czym różni się JDK, JRE i JVM? JVM uruchamia bajtkod, JRE to JVM z bibliotekami standardowymi, a JDK dodaje narzędzia deweloperskie, takie jak kompilator javac.

2. Jak działa Garbage Collector? Automatycznie zwalnia pamięć obiektów, do których nie ma już referencji osiągalnych z korzeni (stos, statyczne pola). Kandydat powinien wspomnieć o generacjach sterty i o tym, że różne kolektory wybiera się pod opóźnienia albo przepustowość.

3. Czym różni się stos od sterty? Na stosie są ramki wywołań metod i zmienne lokalne, każdy wątek ma własny stos. Na stercie żyją obiekty, wspólna dla całej aplikacji.

4. Czym różni się == od equals()? Operator == porównuje referencje (dla typów prostych wartości), a equals() logiczną równość obiektów, jeśli klasa ją nadpisuje.

5. Dlaczego String jest niemutowalny? Dzięki temu jest bezpieczny wątkowo, można go cache'ować (pula stringów), używać jako klucz w mapie i nie zmienia hasha po utworzeniu.

6. Czym różni się String, StringBuilder i StringBuffer? String jest niezmienny, StringBuilder jest zmienny i niesynchronizowany (szybki), StringBuffer jest zmienny i synchronizowany.

7. Co oznacza słowo kluczowe final? Dla zmiennej brak ponownego przypisania, dla metody brak nadpisywania, dla klasy brak dziedziczenia. Referencja final nie oznacza, że obiekt jest niezmienny.

8. Czym są typy opakowujące i autoboxing? Klasy takie jak Integer opakowują typy proste. Autoboxing to automatyczna konwersja, która może prowadzić do NullPointerException przy rozpakowaniu null oraz do kosztu alokacji.

Pytania 9 do 14

9. Czym różni się klasa abstrakcyjna od interfejsu? Klasa abstrakcyjna może mieć stan i konstruktory, a klasa dziedziczy tylko po jednej. Interfejs definiuje kontrakt, klasa może implementować wiele, a od Javy 8 interfejsy mają metody domyślne.

10. Na czym polega polimorfizm? Wywołanie metody na referencji typu bazowego wykonuje wersję z konkretnego typu obiektu w czasie działania programu (dynamic dispatch).

11. Przeciążanie a nadpisywanie metod. Przeciążanie to metody o tej samej nazwie i różnych parametrach, wybierane w czasie kompilacji. Nadpisywanie to zmiana zachowania odziedziczonej metody, wybierane w czasie działania.

12. Co to jest kontrakt equals i hashCode? Obiekty równe według equals muszą mieć ten sam hashCode. Naruszenie powoduje błędy w HashMap i HashSet.

13. Do czego służą wyrażenia lambda i interfejsy funkcyjne? Lambda to zwięzła implementacja interfejsu z jedną metodą abstrakcyjną, na przykład Function czy Predicate. Pozwala przekazywać zachowanie jako argument.

14. Czym są rekordy (record) i zapieczętowane klasy (sealed)? Rekord to zwięzła, niemutowalna klasa danych z generowanymi metodami. Sealed ogranicza, które klasy mogą dziedziczyć po typie, co pomaga modelować zamknięte hierarchie.

Pytania 15 do 20

15. Jak działa HashMap? Klucze trafiają do kubełków według hashCode, kolizje rozwiązuje lista lub drzewo w kubełku. Średni dostęp jest stały, a przy wzroście tablica jest powiększana.

16. ArrayList a LinkedList. ArrayList ma szybki dostęp po indeksie i dobrą lokalność pamięci, LinkedList szybciej wstawia w środku przy znanym węźle, ale w praktyce ArrayList wygrywa w większości przypadków.

17. Czym różni się HashSet od TreeSet? HashSet nie gwarantuje kolejności i daje stały średni czas operacji, TreeSet utrzymuje porządek i działa w czasie logarytmicznym.

18. Czym różnią się Comparable i Comparator? Comparable definiuje naturalny porządek w samej klasie, Comparator to zewnętrzna strategia porównywania, którą można zmieniać.

19. Do czego służy Stream API i czym są operacje pośrednie i końcowe? Strumień opisuje przetwarzanie danych w stylu deklaratywnym. Operacje pośrednie, jak map i filter, są leniwe, a wykonanie zaczyna dopiero operacja końcowa, na przykład collect.

20. Co robi Optional i jak go nie nadużywać? Reprezentuje wartość, która może nie istnieć. Nie stosuje się go w polach encji ani w parametrach, a get() bez sprawdzenia przeczy jego celowi.

Pytania 21 do 25

21. Czym różni się wątek od procesu? Proces ma własną przestrzeń pamięci, wątki w obrębie procesu dzielą pamięć, co daje szybką komunikację, ale wymaga synchronizacji.

22. Do czego służy synchronized i volatile? Synchronized zapewnia wzajemne wykluczanie i widoczność zmian. Volatile gwarantuje widoczność i kolejność odczytu i zapisu pola, lecz nie atomowość złożonych operacji.

23. Czym jest ExecutorService i dlaczego lepiej niż ręczne tworzenie wątków? Zarządza pulą wątków i kolejką zadań, kontroluje zasoby i pozwala na zwracanie wyników przez Future. Kandydat może też wspomnieć o wątkach wirtualnych w nowszych wersjach Javy.

24. Co to jest deadlock i jak mu zapobiegać? To wzajemne blokowanie wątków czekających na zasoby, które trzymają nawzajem. Zapobiega się jednolitą kolejnością zajmowania blokad, krótkimi sekcjami krytycznymi i limitami czasu.

25. Wyjątki checked i unchecked. Checked (dziedziczą po Exception) muszą być obsłużone lub zadeklarowane. Unchecked (RuntimeException) nie wymagają tego i zwykle oznaczają błąd programistyczny. Kandydat powinien znać try-with-resources.

Pytania 26 do 30

26. Czym jest wstrzykiwanie zależności w Springu i jakie są jego zalety? Kontener tworzy obiekty i dostarcza ich zależności, więc klasy nie tworzą ich same. Ułatwia to testowanie i wymianę implementacji. Preferowane jest wstrzykiwanie przez konstruktor.

27. Co robi adnotacja @Transactional i jaka jest typowa pułapka? Obejmuje metodę transakcją. Pułapka to wywołanie metody z tej samej klasy (omija proxy) oraz domyślne wycofywanie tylko po wyjątkach niesprawdzanych.

28. Co to jest problem N+1 w JPA i Hibernate? Pobranie listy encji i osobne zapytanie o relację dla każdej z nich. Rozwiązania to join fetch, grafy encji lub pobieranie wsadowe.

29. Czym różnią się izolacje transakcji i po co istnieją? Poziomy izolacji określają, jakie anomalie współbieżne są dopuszczalne, na przykład brudny odczyt czy odczyt niepowtarzalny. Wyższa izolacja to więcej gwarancji i mniejsza przepustowość.

30. Jak testujesz kod w Javie i co oznacza mockowanie? Testy jednostkowe z JUnit sprawdzają logikę w izolacji, mocki zastępują zależności zewnętrzne, a testy integracyjne weryfikują współpracę komponentów z bazą lub kolejką. Dobra odpowiedź obejmuje proporcje i przykład z projektu.

Pytania dopytujące i sygnały jakości odpowiedzi

Najlepsze pytania rekrutacyjne to te, które wynikają z CV kandydata. Jeśli ktoś wpisał Spring Boot i Kafkę, zapytaj o to, jak skonfigurował konsumentów, jak radził sobie z duplikatami i co robił w razie błędu przetwarzania. Mocny kandydat opowiada o przypadkach i kompromisach, słabszy powtarza definicję. Warto też sprawdzić, czy kandydat potrafi powiedzieć nie wiem i zaproponować, jak by to ustalił, bo w pracy zespołowej to cenniejsze niż pewność siebie bez pokrycia.

Poziomy junior, mid i senior

Dla juniora wystarczą pytania 1 do 14 oraz proste przykłady z kolekcji. Mid powinien swobodnie odpowiadać na pytania z kolekcji, współbieżności, Springa i transakcji. Senior powinien dodatkowo uzasadniać decyzje architektoniczne, wskazywać pułapki wydajnościowe i umieć omówić projektowanie usług. Przy ocenie nie ma sensu oczekiwać odpowiedzi słowo w słowo: liczy się zrozumienie.

Pytania pod konkretne CV

Gotowa lista pytań jest dobrym punktem wyjścia, ale najlepiej działają pytania dopasowane do kandydata i stanowiska. W RekrutacjeIt po ocenie CV pod stack dostajesz pytania na rozmowę oparte na lukach i mocnych stronach konkretnej osoby, a każde wymaganie ma cytat z CV jako dowód. Zobacz stronę rekrutacji Java Developerów, przeczytaj o zadaniach technicznych i sprawdź cennik. Możesz też wrócić na stronę główną i ocenić pierwsze CV.