Zestawy rozmówBlog

Twoja wymarzona praca? Lets Git IT.
Interaktywna platforma przygotowująca do rozmów technicznych dla nowoczesnych programistów.

XGitHub

Platforma

  • Kategorie

Zasoby

  • Blog
  • O aplikacji
  • FAQ
  • Sugestie

Prawne

  • Polityka prywatności
  • Regulamin

© 2026 LetsGit.IT. Wszelkie prawa zastrzeżone.

Java

Baza pytań rekrutacyjnych i wiedzy. Filtruj, szukaj i sprawdzaj swoją wiedzę.

Tematy

Co to jest polimorfizm?

easyooppolymorphismjava+1
Otwórz pytanie

Odpowiedź

Polimorfizm pozwala traktować różne obiekty przez ten sam interfejs lub klasę bazową. Wywołując metodę nadpisaną na referencji typu bazowego, Java wybiera implementację w czasie działania (dynamic dispatch); przeciążanie metod daje polimorfizm czasu kompilacji.

Wyjątki Checked vs Unchecked?

mediumexceptionerror-handlingjava
Otwórz pytanie

Odpowiedź

Wyjątki checked muszą być obsłużone lub zadeklarowane w throws (np. IOException) i zwykle oznaczają sytuacje możliwe do obsłużenia. Wyjątki unchecked dziedziczą po RuntimeException (np. NullPointerException) i najczęściej wskazują błąd programisty; ich obsługa jest opcjonalna.

Interfejs vs Klasa Abstrakcyjna?

mediumoopinterfaceabstract-class+2
Otwórz pytanie

Odpowiedź

Interfejs definiuje kontrakt; klasa może implementować wiele interfejsów, a interfejs może mieć metody domyślne/statyczne, ale nie ma stanu instancji. Klasa abstrakcyjna może zawierać pola, konstruktory i częściową implementację, ale dziedziczyć można tylko po jednej klasie. Interfejsy stosuj do „zdolności”, a abstrakcyjne do wspólnej logiki bazowej.

Dlaczego String jest niemodyfikowalny w Javie?

easystringimmutabilitymemory+1
Otwórz pytanie

Odpowiedź

String jest niemutowalny, aby można go było bezpiecznie współdzielić między wątkami, buforować i internować w puli Stringów oraz używać jako klucz w kolekcjach hashujących (stały hashCode). Zwiększa to też bezpieczeństwo, bo np. nazwy klas czy ścieżki nie mogą zostać zmienione po utworzeniu.

Model pamięci Java: Stos vs Sterta?

mediummemorystackheap+2
Otwórz pytanie

Odpowiedź

Stack to pamięć per‑wątek przechowująca ramki wywołań, lokalne prymitywy i referencje; jest alokowana/zwalniana przy wejściu/wyjściu z metody i działa bardzo szybko. Heap to współdzielona pamięć, gdzie znajdują się obiekty i tablice; zarządza nią GC i obiekty zwykle żyją dłużej niż jedno wywołanie metody.

W Javie, czym różni się `==` od `.equals()`?

easyequalsreferencestring
Otwórz pytanie

Odpowiedź

`==` dla obiektów porównuje referencje (czy to ta sama instancja), a `.equals()` porównuje równość logiczną zdefiniowaną przez klasę (np. `String` porównuje treść). Dla typów prostych `==` porównuje wartości.

Co oznacza `final` dla zmiennej, metody i klasy?

easyfinalinheritancejava-basics
Otwórz pytanie

Odpowiedź

`final` zmienna nie może być ponownie przypisana, `final` metoda nie może być nadpisana, a `final` klasa nie może być dziedziczona. (To nie czyni obiektu automatycznie niemutowalnym.)

String vs StringBuilder vs StringBuffer — kiedy czego używać?

easystringstringbuilderperformance
Otwórz pytanie

Odpowiedź

`String` jest niemutowalny, więc wielokrotne konkatenacje tworzą dużo obiektów. `StringBuilder` jest mutowalny i szybki do składania tekstu w jednym wątku; `StringBuffer` jest podobny, ale zsynchronizowany (dziś rzadko potrzebny).

Wyjątki checked vs unchecked — jaka jest różnica?

mediumexceptionscheckedruntimeexception
Otwórz pytanie

Odpowiedź

Checked exceptions muszą być obsłużone lub zadeklarowane w sygnaturze (dziedziczą po `Exception`, ale nie po `RuntimeException`). Unchecked (`RuntimeException`) nie wymagają tego i zwykle oznaczają błąd programistyczny lub niepoprawny stan.

Autoboxing/unboxing — co to jest i jakie są pułapki?

mediumautoboxingwrappernpe
Otwórz pytanie

Odpowiedź

Autoboxing zamienia prymitywy na wrappery (np. `int`→`Integer`), a unboxing odwrotnie. Pułapki: unboxing `null` daje NPE, cache’owanie `Integer` może mylić przy `==`, a dodatkowe alokacje potrafią zaboleć wydajnościowo.

HashMap vs ConcurrentHashMap — jaka jest praktyczna różnica?

mediumhashmapconcurrencyconcurrenthashmap
Otwórz pytanie

Odpowiedź

`HashMap` nie jest thread-safe; równoległe zapisy mogą go uszkodzić. `ConcurrentHashMap` wspiera bezpieczny dostęp współbieżny z dobrą wydajnością (i nie pozwala na null jako klucz/wartość). Użyj, gdy wiele wątków czyta/zapisuje bez zewnętrznej blokady.

Dlaczego `equals()` i `hashCode()` muszą spełniać kontrakt?

hardequalshashcodehashmap
Otwórz pytanie

Odpowiedź

Jeśli dwa obiekty są równe wg `equals()`, muszą mieć ten sam `hashCode()`. Kolekcje haszujące (HashMap/HashSet) na tym polegają; złamanie kontraktu powoduje „znikające” wpisy i trudne bugi.

`volatile` vs `synchronized` — jaki problem rozwiązuje każde z nich?

hardconcurrencyvolatilesynchronized
Otwórz pytanie

Odpowiedź

`volatile` gwarantuje widoczność (i porządek) zmiennej między wątkami, ale nie robi atomowości dla operacji złożonych. `synchronized` daje wzajemne wykluczanie i jednocześnie zapewnia happens-before (widoczność) dla chronionego fragmentu.

Jak działa Java GC na wysokim poziomie (i czemu jest generacyjne)?

hardgcjvmmemory
Otwórz pytanie

Odpowiedź

Heap jest zwykle podzielony na młodą i starą generację: większość obiektów szybko umiera, więc sprzątanie young gen jest częste i tanie (minor GC). Obiekty żyjące dłużej są promowane; czyszczenie old gen jest rzadsze i zwykle droższe.

CompletableFuture — do czego służy i jaka jest typowa pułapka?

hardcompletablefutureasyncconcurrency
Otwórz pytanie

Odpowiedź

To reprezentacja asynchronicznego obliczenia, które możesz składać (`thenApply/thenCompose`) bez blokowania. Typowa pułapka to zbyt wczesne `get()/join()` (zamiana na kod blokujący) albo brak obsługi wyjątków (`exceptionally/handle`).

W Javie, co oznacza `static` dla pola i metody?

easystaticclassoop
Otwórz pytanie

Odpowiedź

`static` oznacza, że element należy do klasy, a nie do konkretnej instancji. Pole statyczne jest współdzielone przez wszystkie obiekty, a metodę statyczną można wywołać bez tworzenia instancji (ale nie ma ona bezpośredniego dostępu do pól instancji).

HashSet vs TreeSet — jaka jest różnica?

mediumsethashsettreeset+2
Otwórz pytanie

Odpowiedź

HashSet jest zwykle szybszy dla add/contains (średnio O(1)), bo jest oparty o hash. TreeSet trzyma elementy posortowane (zbalansowane drzewo), więc operacje są O(log n), ale dostajesz kolejność i zapytania zakresowe.

Do czego służy `Optional` i jakie jest typowe nadużycie?

mediumoptionalnull-safetyapi
Otwórz pytanie

Odpowiedź

`Optional` reprezentuje wartość, która może być obecna albo nie, i wymusza obsłużenie przypadku pustego. Typowe nadużycie to trzymanie `Optional` jako pola w encjach/DTO wszędzie; najczęściej jest przeznaczony dla wartości zwracanych, a nie pól do serializacji czy persystencji.

Jak może powstać memory leak w Javie mimo garbage collectora?

hardmemory-leakgcreferences+1
Otwórz pytanie

Odpowiedź

GC zwalnia tylko obiekty nieosiągalne. Jeśli przez błąd trzymasz referencje (np. rosnąca statyczna lista/mapa, cache bez eviction, listenery nieusuwane), obiekty pozostają osiągalne i pamięć rośnie.

Czemu `ArrayList` nie jest thread-safe i jak zrobić bezpieczny dostęp do listy?

hardconcurrencyarraylistthread-safety+1
Otwórz pytanie

Odpowiedź

`ArrayList` nie ma synchronizacji, więc równoległe zapisy mogą uszkodzić stan wewnętrzny albo dać niespójne odczyty. Rozwiązania: zewnętrzny lock, `Collections.synchronizedList`, `CopyOnWriteArrayList` (gdy głównie czytasz) albo inne kolekcje współbieżne zależnie od przypadku.

Interfejs vs klasa abstrakcyjna — jaka jest różnica w Javie?

easyinterfaceabstract-classoop
Otwórz pytanie

Odpowiedź

Interfejs definiuje kontrakt (jakie metody istnieją) i wspiera wielokrotne dziedziczenie typu. Klasa abstrakcyjna może współdzielić stan i implementację, ale możesz dziedziczyć tylko po jednej klasie. Interfejs jest dla „umiejętności”, a abstrakcyjna dla wspólnej bazy zachowania.

HashMap vs LinkedHashMap — jaka jest praktyczna różnica?

mediumhashmaplinkedhashmapcollections
Otwórz pytanie

Odpowiedź

HashMap nie gwarantuje kolejności iteracji. LinkedHashMap utrzymuje kolejność dodania (albo kolejność dostępu, jeśli tak ustawisz), co daje przewidywalną iterację i pozwala budować cache typu LRU.

Co to jest try-with-resources i czemu warto go używać?

mediumtry-with-resourcesautocloseableio
Otwórz pytanie

Odpowiedź

Automatycznie zamyka zasoby implementujące `AutoCloseable` (pliki, streamy, JDBC) nawet gdy poleci wyjątek. Zapobiega wyciekom i upraszcza, a jednocześnie uwiarygadnia sprzątanie zasobów.

Java Memory Model: co znaczy „happens-before” (prosto)?

hardjmmhappens-beforeconcurrency+1
Otwórz pytanie

Odpowiedź

Happens-before to reguła gwarantująca widoczność i porządek między wątkami. Jeśli A happens-before B, to B musi zobaczyć efekty A (np. przez `synchronized`, `volatile` albo start/join wątku).

WeakReference — co to jest i kiedy jest przydatne?

hardweakreferenceweakhashmapgc+1
Otwórz pytanie

Odpowiedź

Weak reference nie blokuje GC: jeśli obiekt ma tylko słabe referencje, może zostać zebrany. Przydaje się w cache’ach wrażliwych na pamięć (np. WeakHashMap), gdzie lepiej „zgubić” wpis niż leakować pamięć.

JDK vs JRE vs JVM - czym jest każde z nich?

easyjvmjrejdk+1
Otwórz pytanie

Odpowiedź

JVM uruchamia bytecode Javy. JRE to środowisko uruchomieniowe (JVM + biblioteki standardowe) potrzebne do odpalania aplikacji. JDK to zestaw deweloperski (JRE + kompilator i narzędzia) potrzebny do budowania aplikacji.

Czym jest rekord (record) w Javie i kiedy go użyjesz?

mediumrecordsdtoimmutability+1
Otwórz pytanie

Odpowiedź

Record to zwięzła składnia dla niezmiennego nośnika danych. Generuje final pola, konstruktor oraz `equals/hashCode/toString`. Jest dobry do DTO, wiadomości i obiektów “wartościowych” — nie do encji z rozbudowanym, mutowalnym cyklem życia.

Streamy vs kolekcje: jaka jest różnica i jaki jest częsty błąd?

mediumstreamscollectionsside-effects+1
Otwórz pytanie

Odpowiedź

Kolekcja przechowuje dane; stream opisuje potok operacji (filter/map/reduce), który produkuje wynik. Streamy są zwykle jednorazowe, a częsty błąd to efekty uboczne (mutowanie zewnętrznego stanu) w `map/forEach`, co utrudnia myślenie o kodzie.

Co robi `ThreadLocal` i jaki jest częsty problem?

hardthreadlocalconcurrencythread-pool+1
Otwórz pytanie

Odpowiedź

`ThreadLocal` przechowuje osobną wartość na wątek (często jako kontekst requestu). Częsty problem to pule wątków: wątki są recyklingowane, więc wartości mogą “przeciekać” między requestami, jeśli ich nie wyczyścisz (`remove()` w `finally`).

`synchronized` vs `ReentrantLock` - kiedy wybrać które?

hardconcurrencylockssynchronized+1
Otwórz pytanie

Odpowiedź

`synchronized` jest prostsze i używa monitorów JVM, dając wzajemne wykluczenie oraz jasne happens-before. `ReentrantLock` jest bardziej elastyczny: `tryLock()`, timeouty, opcje fairness i wiele `Condition` — ale musisz zawsze robić `unlock()` w `finally`.

Co to jest classpath w Javie i do czego służy?

easyclasspathjvmjar+1
Otwórz pytanie

Odpowiedź

Classpath to lista miejsc, w których JVM szuka klas i zasobów (katalogi i pliki JAR). Jeśli czegoś nie ma na classpath, możesz dostać `ClassNotFoundException` / `NoClassDefFoundError`. Ustawiasz go przez build tool, IDE albo opcję `-cp` przy uruchamianiu Javy.

Java `var`: co robi i czego NIE robi?

mediumjavavartype-inference+1
Otwórz pytanie

Odpowiedź

`var` daje inferencję typu dla zmiennych lokalnych: kompilator wywnioskuje statyczny typ z inicjalizatora. To NIE robi z Javy języka dynamicznego. `var` działa tylko dla zmiennych lokalnych z inicjalizatorem (nie dla pól, parametrów metod ani bez przypisania).

`List.of(...)`: jaką listę tworzy i jaki jest częsty gotcha?

mediumjavacollectionsimmutability+1
Otwórz pytanie

Odpowiedź

`List.of(...)` tworzy listę niemodyfikowalną (unmodifiable). Próba add/remove skończy się `UnsupportedOperationException`. Częsty gotcha: nie pozwala też na elementy null (rzuci `NullPointerException` już przy tworzeniu).

Parallel streamy: kiedy mogą pomóc i jakie są typowe pułapki?

hardjavastreamsparallel+2
Otwórz pytanie

Odpowiedź

Parallel streamy mogą pomóc przy pracy CPU-bound na dużych kolekcjach, gdy elementy są niezależne, a praca jest na tyle ciężka, żeby opłacił się narzut. Pułapki: domyślnie używają `ForkJoinPool.commonPool`, mogą być wolniejsze dla małych zadań, są złe dla blokującego I/O, a efekty uboczne i współdzielony stan łatwo prowadzą do race condition.

ClassLoadery: co to jest i czemu potrafią powodować zaskakujące ClassCastException?

hardjavaclassloaderjvm+1
Otwórz pytanie

Odpowiedź

ClassLoader ładuje klasy i zasoby. W Javie typ jest identyfikowany przez (nazwa klasy + ClassLoader, który ją załadował). To znaczy, że “ta sama” nazwa klasy załadowana przez dwa różne classloadery jest traktowana jako dwa różne typy, co potrafi dać `ClassCastException` w setupach typu pluginy albo app-serwery.

Co to jest type erasure w generykach Javy i jakie daje ograniczenia?

mediumjavagenericstype-erasure+1
Otwórz pytanie

Odpowiedź

Type erasure oznacza, że informacja o typach generycznych jest usuwana w runtime. W efekcie nie zrobisz `new T()`, `T.class` ani `instanceof T`, a część sprawdzeń działa tylko w czasie kompilacji. W runtime widzisz typy „surowe”.

Java `record`: co generuje i kiedy warto go użyć?

easyjavarecorddto+1
Otwórz pytanie

Odpowiedź

`record` to zwięzły nośnik danych. Generuje prywatne finalne pola, kanoniczny konstruktor, akcesory, `equals`, `hashCode` i `toString`. Sprawdza się jako DTO/obiekt wartości, gdzie równość wynika z danych, ale nie czyni zagnieżdżonych obiektów niemutowalnymi.

Czym są sealed classes w Javie i po co się ich używa?

mediumjavasealedinheritance+1
Otwórz pytanie

Odpowiedź

Sealed class ogranicza, które klasy mogą ją dziedziczyć/implementować (`permits`). Dzięki temu hierarchia jest jawna i można pisać wyczerpujące `switch`. To przydatne do modelowania zamkniętych zestawów wariantów.

`synchronized` vs `ReentrantLock`: jakie są różnice?

mediumjavaconcurrencylocks+1
Otwórz pytanie

Odpowiedź

`synchronized` używa wbudowanych monitorów i automatycznie zwalnia blokadę. `ReentrantLock` to jawny lock z funkcjami typu `tryLock`, polityką fairness i możliwością przerwania oczekiwania — ale musisz go zwolnić w `finally`. Oba są reentrant.

Try-with-resources: czego wymaga i czemu jest przydatne?

easyjavaexceptionsresources+1
Otwórz pytanie

Odpowiedź

Wymaga zasobów implementujących `AutoCloseable`. Zasób jest zamykany automatycznie (nawet przy wyjątku), co zmniejsza boilerplate i zapobiega wyciekom. Jest bezpieczniejsze niż ręczne `finally`.

StringBuilder vs StringBuffer: jaka jest różnica?

easyjavastringperformance+1
Otwórz pytanie

Odpowiedź

StringBuilder nie jest synchronizowany i jest szybszy w kodzie jednowątkowym. StringBuffer jest synchronizowany (thread‑safe), ale zwykle wolniejszy. Oba są mutowalnymi alternatywami dla `String`.

HashMap vs ConcurrentHashMap: kiedy używać którego?

mediumjavacollectionsconcurrency+1
Otwórz pytanie

Odpowiedź

HashMap nie jest thread‑safe i najlepiej używać go w kodzie jednowątkowym lub zewnętrznie synchronizowanym. ConcurrentHashMap wspiera bezpieczne współbieżne odczyty/zapisy z lepszą skalowalnością; nie pozwala na null key/value. Używaj, gdy wiele wątków korzysta z mapy bez dodatkowych locków.

Generacyjny GC: dlaczego JVM dzieli pamięć na young/old?

mediumjavagcjvm+2
Otwórz pytanie

Odpowiedź

Większość obiektów szybko umiera. JVM wykorzystuje to, często sprzątając young generation (szybkie minor GC) i promując długo żyjące obiekty do old generation, które sprząta rzadziej. To poprawia throughput i czasy pauz.

Kompilacja JIT: co to jest i czemu aplikacje Javy się „rozgrzewają”?

mediumjavajitperformance+1
Otwórz pytanie

Odpowiedź

JVM startuje od interpretacji bytecode, a potem JIT kompiluje „gorące” metody do kodu natywnego na podstawie profilowania. Na początku bywa wolniej; po rozgrzaniu działa szybciej dzięki zoptymalizowanemu kodowi maszynowemu.

Klasa zagnieżdżona statyczna vs inner class: jaka jest różnica?

mediumjavanested-classinner-class+1
Otwórz pytanie

Odpowiedź

Statyczna klasa zagnieżdżona nie trzyma ukrytej referencji do obiektu zewnętrznego i można ją tworzyć bez instancji klasy zewnętrznej. Inner class ma referencję do obiektu zewnętrznego, co zwiększa zużycie pamięci i może prowadzić do leaków.