Jeśli kiedykolwiek przygotowywałeś się do rozmowy kwalifikacyjnej na stanowisko programisty Java lub zdawałeś jakikolwiek egzamin certyfikujący (niekoniecznie z programowania), to zapewne zauważyłeś już, że zadawane tam pytania są bardzo konkretne. Wiele z nich zmusza do zastanowienia się nad projektem języka. Niektóre mają na celu zbadanie głębi twojej wiedzy. Są pytania, które bardziej przypominają łamigłówki niż cokolwiek innego, podczas gdy inne dotyczą niuansów języka, które są bardzo trudne do zrozumienia bez praktyki. W tym artykule programista Sarans Sing przedstawia kilka takich pytań dotyczących języka Java. Oczywiście z odpowiedziami.
1. Co się stanie, jeśli wstawię instrukcję return lub System.exit() do bloku try/catch? To bardzo popularne i subtelne pytanie w Javie. Sztuczka polega na tym, że wielu programistów uważa, że

finally
blok jest zawsze wykonywany. Umieszczając return
oświadczenie w try/catch
bloku lub dzwoniąc System.exit()
z wnętrza try/catch
bloku, pytanie podaje w wątpliwość to przekonanie. Odpowiedź na to podchwytliwe pytanie brzmi: blok finally
zostanie wykonany, gdy return
w bloku zostanie umieszczona instrukcja try/catch
, ale nie zostanie wykonany, gdy System.exit()
zostanie wywołany z wnętrza try/catch
bloku. 2. Czy Java obsługuje dziedziczenie wielokrotne? To bardzo trudne pytanie. Ankieterzy często pytają: „Jeśli C++ obsługuje bezpośrednie dziedziczenie wielokrotne, to dlaczego Java nie może?” odpowiedź _jest nieco bardziej skomplikowane, niż mogłoby się wydawać, ponieważ Java obsługuje dziedziczenie wielu typów. W końcu interfejs Java może rozszerzać inne interfejsy. To powiedziawszy, Java nie obsługuje wielokrotnego dziedziczenia implementacji. 3. Jeśli metoda w klasie nadrzędnej zgłasza NullPointerException
s, czy można ją przesłonić metodą, która rzuca RuntimeException
s? To kolejne trudne pytanie związane z przeciążaniem i nadpisywaniem. Odpowiedź: Przesłonięta metoda może bezpiecznie rzucić NullPointerException
klasę nadrzędną — RuntimeException, ale nie możesz zrobić tego samego ze sprawdzonym typem wyjątku, takim jak Exception
. 4. W jaki sposób gwarantujecie, że N
wątki będą miały dostęp do N
zasobów bez impasu? Jeśli pisanie kodu wielowątkowego nie jest twoją mocną stroną, możesz naprawdę natknąć się na to pytanie. Może to być trudne nawet dla doświadczonego programisty, który nie spotkał się z zakleszczeniami i warunkami wyścigu. Cała sztuczka polega tutaj na kolejności: możesz zapobiec impasowi, uwalniając zasoby w odwrotnej kolejności, w jakiej zostały pozyskane. 5. Jaka jest różnica między klasami StringBuffer
i StringBuilder
w Javie? To klasyczne pytanie w języku Java, które niektórzy programiści uważają za trudne, a inni za bardzo proste. Klasa StringBuilder
pojawiła się w JDK 1.5. Jedyna różnica między tymi klasami polega na tym, że StringBuffer
metody, takie jak length()
, capacity()
, i append()
, są zsynchronizowane, podczas gdy odpowiednie metody wStringBuilder
nie są. Ta podstawowa różnica oznacza, że konkatenacja łańcuchów jest szybsza z StringBuilder
niż z StringBuffer
. W rzeczywistości używanie StringBuffer
nie jest zalecane, ponieważ konkatenacja łańcuchów odbywa się w tym samym wątku w 99% przypadków. 6. Jaki jest wynik oceny wyrażenia 1,0/0,0? Czy spowoduje wyjątek lub błąd kompilacji? To kolejne trudne pytanie dotyczące klasy. Programiści Java są świadomi istnienia prymitywnego podwójnego typu danych i klasy , ale podczas wykonywania operacji zmiennoprzecinkowych nie zwracają wystarczającej uwagi na , , , i reguły rządzące związanymi z nimi obliczeniami arytmetycznymi. Odpowiedź na to pytanie jest prosta: a
Double
Double
Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY
NaN
-0.0
ArithmeticException
nie zostanie rzucony; wyrażenie ma wartość Double.POSITIVE_INFINITY
. 7. Co się stanie, jeśli spróbujesz włożyć klucz do komputera, HashMap
który już zawiera ten klucz? To podchwytliwe pytanie jest częścią innego często zadawanego pytania: jak działa HashMap
w Javie? HashMap
jest popularnym źródłem mylących i podchwytliwych pytań dotyczących języka Java. Oto odpowiedź: jeśli spróbujesz ponownie wstawić klucz do pliku HashMap
, stary klucz zostanie zastąpiony, ponieważ HashMap
klasa nie zezwala na powielanie kluczy. I ten sam klucz otrzyma ten sam kod skrótu, co oznacza, że skończy w tym samym miejscu w zasobniku z haszem. Na podstawie materiałów Quora
GO TO FULL VERSION