Pitanja za Java intervju

1. Uvod

Ovaj članak sadrži odgovore na neka od najvažnijih pitanja o razgovoru za posao o jezgri Java. Odgovori na neke od njih možda nisu očigledni, pa će ovaj članak pomoći da se stvari raščiste.

2. Core-Java jezična pitanja za početnike

Q1. Prolaze li podaci putem reference ili vrijednosti u Javi?

Iako je odgovor na ovo pitanje prilično jednostavan, ovo pitanje može zbuniti početnike. Prvo razjasnimo o čemu se radi u pitanju:

  1. Prolaz pored vrijednosti - to znači da prolazimo kopija predmeta kao parametar u metodu.
  2. Prolaz pored reference - to znači da prolazimo referenca na objekt kao parametar u metodu.

Da bismo odgovorili na pitanje, moramo analizirati dva slučaja. Oni predstavljaju dvije vrste podataka koje možemo proslijediti metodi: primitivne i objektne.

Kad metodi proslijedimo primitive, njezina se vrijednost kopira u novu varijablu. Što se tiče objekata, vrijednost reference se kopira u novu varijablu. Tako možemo reći da je Java strogo prolazna vrijednost Jezik.

O tome možemo saznati više u jednom od naših članaka: Prosljeđivanje vrijednosti kao mehanizam prolaska parametara u Javi.

Q2. Koja je razlika između uvoza i statičkog uvoza?

Redovni uvoz možemo koristiti za uvoz određene klase ili svih klasa definiranih u drugom paketu:

uvoz java.util.ArrayList; // uvoz specifične klase java.util. *; // sve klase u util paketu

Također ih možemo koristiti za uvoz javnih ugniježđenih klasa zatvorene klase:

uvoz com.baeldung.A. *

Međutim, trebali bismo biti svjesni da gornji uvoz ne uvozi klasu A sebe.

Postoje i statički uvozi koji nam omogućuju uvoz statičkih članova ili ugniježđenih klasa:

uvoz statičke java.util.Collections.EMPTY_LIST;

Učinak je taj da možemo koristiti statičku varijablu EMPTY_LIST bez dodavanja potpuno kvalificiranog imena klase, tj. Kao da je deklarirana u trenutnoj klasi.

Q3. Koji su modifikatori pristupa dostupni u Javi i koja je njihova svrha?

U sustavu postoje četiri modifikatora pristupa Java:

  1. privatni
  2. zadano (paket)
  3. zaštićen
  4. javnost

The privatni modifikator osigurava da članovi klase neće biti dostupni izvan klase. Može se primijeniti na metode, svojstva, konstruktore, ugniježđene klase, ali ne i na same klase najviše razine.

Za razliku od privatni modifikator, možemo primijeniti zadano modifikator za sve vrste članova klase i za samu klasu. Možemo se prijaviti zadano vidljivost dodavanjem modifikatora pristupa uopće. Ako koristimo zadano vidljivost našeg razreda ili njegovih članova bit će dostupna samo unutar paketa našeg razreda. Morali bismo imati na umu da zadani modifikator pristupa nema ništa zajedničko s zadano ključna riječ.

Slično kao zadano modifikator, mogu pristupiti sve klase unutar jednog paketa zaštićen članova. Štoviše, zaštićen modifikator omogućuje potklasama pristup zaštićenim članovima superrazrede, čak i ako nisu unutar istog paketa. Ovaj modifikator pristupa ne možemo primijeniti na klase, samo na članove klase.

The javnost modifikator se može koristiti zajedno s ključnom riječi klase i svim članovima razreda. Čini predavanja i članove razreda dostupnim u svim paketima i svim razredima.

Više možemo saznati u članku Java Access Modifiers.

Q4. Koji su još modifikatori dostupni u Javi i koja je njihova svrha?

U Javi je dostupno pet drugih modifikatora:

  • statički
  • konačni
  • sažetak
  • sinkronizirano
  • hlapljiv

Oni ne kontroliraju vidljivost.

Prije svega, možemo primijeniti statički ključna riječ za polja i metode. Statička polja ili metode su članovi klase, dok su nestatična članovi objekta. Članovi predavanja ne trebaju pozivati ​​nijednu instancu. Pozivaju se s imenom klase umjesto naziva reference objekta. Ovaj članak detaljnije govori o statički ključna riječ.

Tada imamo konačni ključna riječ. Možemo ga koristiti s poljima, metodama i klasama. Kada konačni koristi se na polju, to znači da se referenca polja ne može mijenjati. Dakle, ne može se dodijeliti drugom objektu. Kada konačni primjenjuje se na klasu ili metodu, osigurava nam da se ta klasa ili metoda ne može proširiti ili poništiti. The konačni ključna riječ detaljnije je objašnjena u ovom članku.

Sljedeća je ključna riječ sažetak. Ovaj može opisati klase i metode. Kad su razredi sažetak, ne mogu se instancirati. Umjesto toga, trebali bi biti podrazvrstani. Kad su metode sažetak, oni su ostali bez implementacije i mogu se nadjačati u podrazredima.

The sinkronizirano ključna riječ može biti najnaprednija. Možemo ga koristiti s instancom, kao i sa statičkim metodama i blokovima koda. Kada koristimo ovu ključnu riječ, natjeramo Java da koristi zaključavanje monitora kako bi omogućila sinkronizaciju na zadanom fragmentu koda. Više informacija o sinkronizirano možete pronaći u ovom članku.

Zadnja ključna riječ o kojoj ćemo razgovarati je hlapljiv. Možemo ga koristiti samo zajedno s poljima instance. Izjavljuje da se vrijednost polja mora čitati i zapisivati ​​u glavnu memoriju - zaobilazeći predmemoriju CPU-a. Sva čitanja i pisanja za hlapljivu varijablu su atomska. Hlapljiva ključna riječ detaljno je objašnjena u ovom članku.

P5. Koja je razlika između JDK, JRE i JVM?

JDK stoji za Java razvojni komplet, što je skup alata potrebnih programerima za pisanje aplikacija na Javi. Postoje tri vrste JDK okruženja:

  • Standard Edition - razvojni komplet za stvaranje prijenosnih aplikacija za radne površine ili poslužitelje
  • Enterprise Edition - proširenje za Standard Edition s podrškom za distribuirano računanje ili web usluge
  • Micro Edition - razvojna platforma za ugrađene i mobilne aplikacije

U JDK ima dosta alata koji pomoć programerima u pisanju, uklanjanju pogrešaka ili održavanju aplikacija. Najpopularniji su kompajler (javac), prevoditelj (Java), arhivar (staklenka) i generator dokumentacije (javadoc).

JRE je Java Runtime Environment. To je dio JDK, ali sadrži minimalnu funkcionalnost za pokretanje Java aplikacija. Sastoji se od a Java virtualni stroj, osnovne klase i datoteke s podrškom. Na primjer, nema nijedan prevodilac.

JVM je kratica za Java virtualni stroj, koji je virtualni stroj koji može pokretati programe kompajlirane u bajtkod. Opisana je JVM specifikacijom, jer je važno osigurati interoperabilnost između različitih implementacija. Najvažnija funkcija JVM-a je omogućiti korisnicima da isti Java program primene u različite operativne sustave i okruženja bez brige o tome što se krije ispod.

Za više informacija provjerimo razliku između članaka JVM, JRE i JDK.

P6. Koja je razlika između stoga i hrpe?

Postoje dva dijela memorije u kojima JVM pohranjuje sve varijable i objekte. Prva je stog a drugo je hrpa.

The stog je mjesto gdje JVM rezervira blokove za lokalne varijable i dodatne podatke. Stog je a LIFO (zadnji u prvom izlazu) struktura. To znači da je svaki put kad se metoda pozove, novi blok rezerviran za lokalne varijable i reference na objekt. Svako pozivanje nove metode rezervira sljedeći blok. Kada metode dovrše svoje izvršavanje, blokovi se oslobađaju obrnutim načinom na koji su započeti.

Svaka nova nit ima svoj stog.

Morali bismo biti svjesni da stog ima puno manje memorijskog prostora od hrpe. A kad je stog pun, JVM će baciti a StackOverflowError. Vjerojatno će se dogoditi kada postoji loš rekurzivni poziv i rekurzija ode preduboko.

Svaki novi objekt kreira se na Javi hiscuriti koja se koristi za dinamičku dodjelu. Tamo je gsakupljač smeća koja je odgovorna za brisanje neiskorištenih predmeta koji se dijele na mlade (vrtić) i stare prostore. Pristup memoriji hrpi sporiji je od stoga. JVM baca OutOfMemoryError kad se gomila napuni.

Više pojedinosti možemo pronaći u članku Stack Memory and Heap Space u Javi.

P7. Koja je razlika između Usporedive i Usporednik Sučelja?

Ponekad kada pišemo novu klasu, željeli bismo biti u mogućnosti usporediti objekte te klase. Posebno je korisno kada želimo koristiti razvrstane zbirke. Postoje dva načina na koja to možemo učiniti: pomoću Usporedive sučelje ili s Usporednik sučelje.

Prvo, pogledajmo Usporedive sučelje:

javno sučelje Usporedivo {int compareTo (T var1); }

To bismo sučelje trebali implementirati prema klasi čije objekte želimo sortirati.

Ima compareTo () metoda i vraća cijeli broj. Može vratiti tri vrijednosti: -1, 0 i 1, što znači da je ovaj objekt manji od, jednak ili veći od uspoređenog objekta.

Vrijedno je spomenuti da je nadjačana usporediT0 () metoda treba biti u skladu s jednako () metoda.

S druge strane, možemo koristiti Usporednik sučelje. Može se prenijeti na vrsta() metode Kolekcija sučelje ili prilikom instanciranja razvrstanih kolekcija. Zbog toga se uglavnom koristi za stvaranje jednokratne strategije sortiranja.

Štoviše, korisno je i kada koristimo klasu treće strane koja ne implementira usporedivo sučelje.

Poput compareTo () metoda, nadjačana usporedi () metode trebaju biti u skladu s jednako () metodom, ali po želji mogu dopustiti usporedbu s nulama.

Posjetimo članak Usporednik i usporedivo u Javi za više informacija.

P8. Što je poništiti Tip i kada ga koristimo?

Svaki put kad napišemo metodu na Javi, ona mora imati povratni tip. Ako želimo da metoda ne vraća vrijednost, možemo koristiti poništiti ključna riječ.

Također bismo trebali znati da postoji Poništiti razred. To je klasa rezerviranog mjesta koja se može koristiti, na primjer, pri radu s generičkim lijekovima. The Poništiti klasa ne može biti instancirana niti proširena.

P9. Koje su metode klase predmeta i što rade?

Važno je znati koje metode Objekt razred sadrži i kako oni rade. Također je vrlo korisno kada želimo poništiti te metode:

  • klon() - vraća kopiju ovog objekta
  • jednako () - vraća se pravi kada je ovaj objekt jednak objektu prosljeđenom kao parametar
  • finalizirati () - skupljač smeća poziva ovu metodu dok čisti memoriju
  • getClass () - vraća klasu izvođenja ovog objekta
  • hashCode () - vraća hash kod ovog objekta. Morali bismo biti svjesni da bi to trebalo biti u skladu s jednako () metoda
  • obavijestiti() - šalje obavijest jednoj niti koja čeka monitor objekta
  • notifyAll () - šalje obavijest svim nitima koje čekaju monitor objekta
  • toString () - vraća nizni prikaz ovog objekta
  • čekati() - postoje tri preopterećene verzije ove metode. Prisiljava trenutnu nit da čeka određeno vrijeme dok druga nit ne pozove obavijestiti() ili notifyAll () na ovom objektu.

Q10. Što je enum i kako ga možemo koristiti?

Enum je vrsta klase koja programerima omogućuje određivanje skupa unaprijed definiranih vrijednosti konstante. Da bismo stvorili takvu klasu, moramo koristiti nabrajanje ključna riječ. Zamislimo popis dana u tjednu:

javni popisi Dan {NEDJELJA, PONEDJELJAK, UTORAK, SRIJEDA, ČETVRTAK, PETAK, SUBOTA}

Za iteraciju svih konstanti možemo koristiti statiku vrijednosti () metoda. Štoviše, enumi nam omogućuju definiranje članova poput svojstava i metoda poput redovnih klasa.

Iako je to posebna vrsta klase, ne možemo je podrazrediti. Enum može, međutim, implementirati sučelje.

Još jedna zanimljiva prednost Enum jest da su oni zaštićeni nitima i zato se popularno koriste kao pojedinačni.

Više o Enumima možemo pronaći u jednom od naših vodiča.

Q11. Što je a JAR?

JAR je prečac za Java arhiva. To je arhivska datoteka pakirana u formatu ZIP datoteke. Možemo ga koristiti za uključivanje datoteka klase i pomoćnih resursa potrebnih za aplikacije. Ima mnoge značajke:

  • Sigurnost - možemo digitalno potpisivati ​​JAR datoteke
  • Kompresija - dok koristimo JAR, možemo komprimirati datoteke radi učinkovite pohrane
  • Prijenosnost - možemo koristiti istu JAR datoteku na više platformi
  • Verziranje - JAR datoteke mogu sadržavati metapodatke o datotekama koje sadrže
  • Brtvljenje - možemo zapečatiti paket unutar JAR datoteke. To znači da sve klase iz jednog paketa moraju biti uključene u istu JAR datoteku
  • Proširenja - format datoteke JAR možemo koristiti za pakiranje modula ili proširenja za postojeći softver

Q12. Što je aNullPointerException?

The NullPointerException je vjerojatno najčešća iznimka u svijetu Jave. To je neprovjerena iznimka i time se proširuje RuntimeException. Ne bismo se trebali pokušavati nositi s tim.

Ova se iznimka izbacuje kada pokušavamo pristupiti varijabli ili pozvati metodu nulte reference, na primjer kada:

  • pozivajući se na metodu nulte reference
  • postavljanje ili dobivanje polja nulte reference
  • provjeravanje duljine nule reference niza
  • postavljanje ili dobivanje stavke nulte reference niza
  • bacanje null

Q13. Koje su dvije vrste lijevanja u Javi? Koja se iznimka može baciti tijekom lijevanja? Kako to možemo izbjeći?

U Javi možemo razlikovati dvije vrste lijevanja. Možemo obaviti nadogradnju koja baca objekt na supertip ili downcasting koji baca objekt na podtip.

Upcasting je vrlo jednostavno, jer to uvijek možemo učiniti. Na primjer, možemo nadograditi a Niz primjer na Objekt tip:

Objekt str = "niz";

Alternativno, možemo oboren varijabla. Nije toliko sigurno kao nadogradnja, jer uključuje provjeru tipa. Ako netočno bacimo objekt, JVM će baciti a ClassCastExcpetion za vrijeme izvođenja. Srećom, možemo koristiti instanceof ključna riječ za sprečavanje nevaljanog lijevanja:

Objekt o = "niz"; Niz str = (Niz) o; // u redu je Objekt o2 = novi Object (); Niz str2 = (Niz) o2; // ClassCastException će se baciti ako (o2 instanceof String) {// vraća false String str3 = (String) o2; }

U ovom članku možemo saznati više o lijevanju tipova.

3. Core-Java jezična pitanja za napredne programere

Q1. Zašto je string nepromjenjiva klasa?

To bismo trebali znati Niz Objekti se prema objektima odnose drugačije nego prema drugim objektima JVM. Jedna je razlika u tome Niz predmeti su nepromjenjivi. Znači da ih ne možemo mijenjati nakon što smo ih stvorili. Postoji nekoliko razloga zašto se tako ponašaju:

  1. Pohranjeni su u niz struna što je poseban dio memorije hrpe. Odgovorna je za uštedu puno prostora.
  2. Nepromjenjivost Niz klasa jamči da se njezin hash kod neće promijeniti. Zbog te činjenice, Žice može se učinkovito koristiti kao ključevi u zbirkama za raspršivanje. Možemo biti sigurni da nećemo prebrisati nikakve podatke zbog promjene hash kodova.
  3. Mogu se sigurno koristiti na nekoliko niti. Nijedna nit ne može promijeniti vrijednost a Niz objekt, tako da sigurnost navoja dobivamo besplatno.
  4. Žice su nepromjenjive kako bi se izbjegli ozbiljni sigurnosni problemi. Nepouzdani izvor ili neka druga nit može promijeniti osjetljive podatke poput lozinki.

U ovom članku možemo saznati više o nepromjenjivosti žica.

Q2. Koja je razlika između dinamičkog i statičkog povezivanja?

Vezanje u Javi postupak je povezivanja poziva metode s odgovarajućim tijelom metode. U Javi možemo razlikovati dvije vrste vezivanja: statičko i dinamičko.

Glavna razlika između statičkog i dinamičkog vezanja je u tome što se statičko vezanje događa u vrijeme kompajliranja i dinamičko vezanje u vrijeme izvođenja.

Statično vezivanje koristi podatke klase za vezivanje. Odgovorna je za rješavanje članova razreda privatni ili statički i konačni metode i varijable. Također, statičko vezanje veže preopterećene metode.

Dinamičko vezanjes druge strane koristi podatke o objektu za rješavanje veza. Zato je odgovoran za rješavanje virtualnih i nadjačanih metoda.

Q3. Što je JIT?

JIT stoji za "točno u vrijeme". To je komponenta JRE-a koja se izvodi u vrijeme izvođenja i povećava performanse aplikacije. Točnije, riječ je o kompajleru koji se pokreće odmah nakon pokretanja programa.

To se razlikuje od uobičajenog Java kompajlera koji kompajlira kod puno prije pokretanja aplikacije. JIT može ubrzati aplikaciju na različite načine.

Na primjer, JIT kompajler odgovoran je za brzo kompajliranje bajtkoda u matične upute radi poboljšanja performansi. Također, može optimizirati kod prema ciljanom CPU-u i operativnom sustavu.

Uz to, ima pristup mnogim statistikama izvođenja koje se mogu koristiti za ponovnu kompilaciju za optimalne performanse. Uz to može izvršiti neke globalne optimizacije koda ili preurediti kôd radi boljeg korištenja predmemorije.

Q4. Što je refleksija u Javi?

Refleksija je vrlo moćan mehanizam u Javi. Reflection je mehanizam Java jezika koji omogućava programerima da istraže ili modificiraju unutarnje stanje programa (svojstva, metode, klase itd.) Tijekom izvođenja. Paket java.lang.reflect pruža sve potrebne komponente za korištenje refleksije.

Kada koristimo ovu značajku, možemo pristupiti svim mogućim poljima, metodama, konstruktorima koji su uključeni u definiciju klase. Možemo im pristupiti bez obzira na njihov modifikator pristupa. To znači da smo, na primjer, u mogućnosti pristupiti privatnim članovima. Da bismo to učinili, ne moramo znati njihova imena. Sve što moramo učiniti je koristiti neke statičke metode Razred.

Vrijedno je znati da postoji mogućnost ograničenja pristupa refleksijom. Da bismo to učinili, možemo koristiti Java upravitelj sigurnosti i datoteku Java sigurnosne politike. Omogućuju nam da dodijelimo dopuštenja nastavi.

Kada radimo s modulima od Jave 9, trebali bismo znati da prema zadanim postavkama ne možemo koristiti refleksiju klasa uvezenih iz drugog modula. Da bismo drugim razredima omogućili korištenje refleksije za pristup privatnim članovima paketa, moramo odobriti dozvolu „Reflection“.

Ovaj članak detaljnije govori o Java Reflectionu.

P5. Što je a Učitavač?

The učitavač je jedna od najvažnijih komponenti u Javi. To je dio JRE-a.

Jednostavno rečeno, učitavač odgovoran je za učitavanje klasa u JVM. Možemo razlikovati tri vrste učitavača:

  • Učitavač učionica Bootstrap - učitava osnovne Java klase. Smješteni su u / jre / lib imenik
  • Učitavač učitavanja proširenja - učitava klase smještene u / jre / lib / lok ili na putu definiranom java.ext.dirs imovine
  • Učitavač sustava - učitava klase na stazi naše aplikacije

Učitavač klasa učitava klase "na zahtjev". To znači da se klase učitavaju nakon što ih program pozove. Štoviše, učitelj učitavanja može učitati razred s danim imenom samo jednom. Međutim, ako istu klasu učitavaju dva različita učitavača klase, tada te klase ne uspijevaju u provjeri jednakosti.

Više podataka o učitavačima razreda nalazi se u članku Učitavači klasa u Javi.

P6. Koja je razlika između učitavanja statičke i dinamičke klase?

Učitavanje statičke klase odvija se kada imamo izvorne klase dostupne u vrijeme sastavljanja. Možemo ga iskoristiti stvaranjem primjeraka objekta pomoću novi ključna riječ.

Dinamičko učitavanje klase odnosi se na situaciju kada ne možemo pružiti definiciju klase u vrijeme sastavljanja. Ipak, to možemo učiniti tijekom izvođenja. Da bismo stvorili instancu klase, moramo koristiti Class.forName () metoda:

Class.forName ("oracle.jdbc.driver.OracleDriver") 

P7. Koja je svrha Serijalizirati Sučelje?

Možemo koristiti Serijalizirati sučelje za omogućavanje serializacije klase, koristeći Java-ov API za serializaciju. Serijalizacija je mehanizam za spremanje stanja objekta kao slijed bajtova, dok je deserializacija mehanizam za vraćanje stanja objekta iz niza bajtova. Serijalizirani izlaz sadrži stanje objekta i neke metapodatke o tipu objekta i vrstama njegovih polja.

Morali bismo znati da se podtipovi klasa koje se mogu serirati mogu i serializirati. Međutim, ako želimo učiniti klasu serializabilnom, ali njen supertip je neserializirati, moramo učiniti dvije stvari:

  • provesti Serijalizirati sučelje
  • osigurati da u superklasi nije prisutan konstruktor bez argumenata

Više o serializaciji možemo pročitati u jednom od naših članaka.

P8. Postoji li destruktor u Javi?

U Javi sakupljač smeća automatski briše neiskorištene predmete kako bi oslobodio memoriju. Programeri nemaju potrebu označavati objekte za brisanje, jer je sklono pogreškama. Dakle, razumno je da Java nema dostupne destruktore.

U slučaju da objekti sadrže otvorene utičnice, otvorene datoteke ili veze s bazom podataka, sakupljač smeća nije u mogućnosti povratiti te resurse. Resurse možemo osloboditi u Zatvoriti metoda i uporaba probaj-napokon sintaksa za pozivanje metode nakon Java 7, kao što su I / O klase FileInputStreami FileOutputStream. Od Jave 7 možemo implementirati sučelje AutoCloseable i koristiti pokušajte s resursima izjava za pisanje kraćeg i čišćeg koda. Ali moguće je da korisnici API-ja zaborave nazvati Zatvoriti metoda, tako da dovršiti metoda i Čistač klase koja postoji kao zaštitna mreža. Ali imajte na umu da nisu jednaki destruktoru.

Nije zajamčeno oboje finalizirati metoda i Čistač klasa će se pokrenuti odmah. Čak nemaju priliku trčati prije izlaska JVM-a. Iako bismo mogli nazvati System.runFinalization predložiti da JVM pokrene dovršiti metode bilo kojih objekata koji čekaju na finalizaciju, još uvijek nije deterministička.

Štoviše, dovršiti Ova metoda može uzrokovati probleme s performansama, zastoje itd. Više informacija možemo pronaći gledajući jedan od naših članaka: Vodič za finaliziranje metode u Javi.

Od Jave 9, Čistač klasa je dodana da zamijeni dovršiti metoda zbog loših strana koje ima. Kao rezultat, imamo bolju kontrolu nad koncem koji vrši akcije čišćenja.

No, java specifikacija ukazuje na ponašanje čistača tijekom System.exit specifična je za implementaciju, a Java ne daje jamstva hoće li se aktivirati radnje čišćenja ili ne.