Millised on 10 kõige levinumat Java-intervjuu küsimust? (Ja kuidas neile vastata)
Java on laialt kasutatav programmeerimiskeel ja selle unikaalsed omadused on tööandjatele hästi teada. Seetõttu küsitakse intervjuu alguses sageli küsimusi Java erinevate aspektide kohta. Oleme koostanud nimekirja kümnest Java-arendajatele sageli esitatavast küsimusest ja lisanud ka vastused neile.
Käesolev artikkel annab ülevaate võimalikest küsimustest, mida teile võib arendaja tööintervjuul Java kohta esitada. Sõltuvalt ametikohale nõutavast töökogemusest võivad mõned küsimused olla üksikasjalikumad. Mõnikord esitatakse kõrgemate ametikohtade intervjuudes stsenaariume, mis sisaldavad tahtlikke vigu või on selgelt eksitavad, et testida kandidaadi tehnilisi teadmisi. Seetõttu on oluline intervjuuks hästi ette valmistuda.
Küsimus 1: Millised on Java eripärad ja milliseid eeliseid pakub see programmeerimiskeel?
Java on võimas ja laialt kasutatav keel, mis on muutnud selle populaarseks programmeerimiskeeleks. Mitmed unikaalsed omadused teevad Java eriliseks, eriti selle kasutamisviisi poolest. Java peamine eelis on see, et selle koodi saab kasutada erinevates operatsioonisüsteemides ilma muudatusteta.
Selline paindlikkus on võimalik tänu Java Virtual Machine’ile, mis tagab, et arendus ja rakendamine ei ole piiratud konkreetse platvormiga, võimaldades koodi kasutada mitmel platvormil. See tagab programmide paindliku ja tõhusa töötamise erinevatel seadmetel.
Java teine eelis on Garbage Collectori poolt pakutav automaatne mäluhaldus, mis lihtsustab mälu ressursside haldamist ja vähendab võimalikke vigu. Lisaks kiirendab Java ulatuslikud standardteegid, mis sisaldavad paljusid valmis funktsioone, rakenduste arendamist.
Objektorienteeritud programmeerimiskeelena paistab Java, nagu ka teised selle kategooria keeled, silma sellega, et tarkvarakomponente on lihtsam modelleerida ja koodi saab korduvalt taaskasutada.
Küsimus 2: Kuidas Java käsitleb mitmekordset pärimist?
Põhimõtteliselt ei toeta Java klasside mitmekordset pärandamist. See tähendab, et klassid saavad pärandada ainult ühest klassist. Mitmekordne pärandamine võib objektorienteeritud programmeerimises koodile negatiivselt mõjuda, tuntud probleemiks on teemantprobleem.
Kuigi Java-klassides ei ole mitmekordne pärimine võimalik, saab seda probleemi lahendada liideste abil. Kuna klass võib Java-s rakendada mitut liidest, saab see pärida funktsioone erinevatest allikatest. See ülesanne tagab, et funktsioonid on selgelt määratletud ja mitmekordse pärimisega seotud probleeme ei teki.
Küsimus 3: Mis vahe on Java abstraktsel klassil ja liidesel?
Java-s kasutatakse abstraktseid klasse ja liideseid abstraktsete tüüpide määratlemiseks, mida seejärel saavad rakendada teised klassid. Nende vahel on olulisi erinevusi, eriti pärimiseeskirjade osas:
- Pärimine: Java keeles võib klass pärida ainult abstraktsest klassist. Abstraktsed klassid ei saa omakorda teostada mitmekordset pärimist, mis tähendab, et selleks tuleb rakendada mitu liidest.
- Klasside suhe: Kuna klass saab pärida ainult abstraktselt klassilt, sobib abstraktsete klasside kasutamine hästi „on” suhete jaoks, samas kui liidesed sobivad paremini „võib” suhete jaoks.
- Konkreetsus: Abstraktne klass võib sisaldada abstrakteid (rakendamata) ja konkreetseid (rakendatud) meetodeid ning võib omada ka instantsi muutujaid. Seevastu liidesed võivad defineerida ainult abstrakteid meetodeid ja konstante. Kõik liidese meetodid on implitsiitselt abstraktsed ja avalikud.
- Funktsionaalsus: abstraktsed klassid tuginevad ühise rakenduse jagamisele (ja mitme liidese rakendamisele). Liidesed on aga mõeldud konkreetsete funktsioonide deklareerimiseks, mis seejärel rakendatakse erinevates klassides.
Küsimus 4: Mis vahe on instantsi muutujatel ja lokaalsetel muutujatel?
Instantsi muutujate ja kohalike muutujate peamine erinevus seisneb nende ulatuses ja elueas. Instantsi muutujad on peamiselt klassi objektide omadused. Kohalikud muutujad esindavad ajutiselt loodud väärtusi kindlas ulatuses.
Instantsi muutujad
- Instantsi muutujad on muutujad, mis on deklareeritud klassi tasandil, väljaspool meetodeid, konstruktoreid ja plokke.
- Igal klassi objektil on oma instantsi muutuja koopia.
- Instantsi muutujatele pääseb ligi klassi instantsi kaudu. Väärtused võivad klassi iga objekti puhul erineda.
Kohalikud muutujad
- Kohalikud muutujad deklareeritakse meetodi, konstruktori või ploki sees. Nende kehtivus on piiratud selle määratletud alaga.
- Need muutujad tuleb enne kasutamist selgesõnaliselt initsialiseerida ja need eksisteerivad ainult koodiblokki täitmise ajal.
- Need ei ole nähtavad väljaspool koodiblokki, kus need deklareeriti.
Küsimus 5: Mida tähendavad terminid JVM, JDK ja JRE ning kuidas need üksteisest erinevad?
Kuigi need terminid võivad lühendatuna sarnased tunduda, on nende aluseks olevad ülesanded ja ulatus Java raames põhimõtteliselt erinevad.
Java virtuaalmasin (JVM)
- Java Virtual Machine (JVM) on virtuaalmasin, mis toimib liidesena Java programmi ja aluseks oleva riistvara või operatsioonisüsteemi vahel, täites Java baitkoodi.
- JVM on oluline, kuna see on käivituskeskkond, mis suudab täita sama baitkoodi erinevatel operatsioonisüsteemidel, tingimusel et see on vastavatel platvormidel kättesaadav. See aitab oluliselt kaasa Java ülekantavusele.
- See ülekantavus on võimalik tänu Java kompilaatorile, mis tõlgib Java lähtekoodi baitkoodiks, mida JVM seejärel interpreteerib.
Java arenduskomplekt (JDK)
- Java Development Kit (JDK) on terviklik arenduspakett, mis koondab erinevaid tööriistu, mis aitavad Java-rakenduste arendamisel. See sisaldab tööriistu rakenduste loomiseks, kompileerimiseks ja veaparandamiseks.
- JDK sisaldab Java kompilaatorit, Java virtuaalmasinat (JVM), Java veaparandajat ja Java profiilija.
- Lisaks nendele tööriistadele sisaldab JDK suurt hulka eelmääratletud klasse ja liideseid sageli kasutatavate funktsioonide jaoks, mis on saadaval Java API-s või Java klassiraamatukogus.
Java-käivituskeskkond (JRE)
- Java Runtime Environment (JRE) pakub vähendatud keskkonda, kus saab käivitada Java-rakendusi.
- JRE sisaldab Java Virtual Machine’i (JVM) ja Java API-d, mis on mõlemad vajalikud rakenduste käivitamiseks ja käitamiseks.
- Arendusvahendid, nagu Java kompilaator, ei kuulu JRE-sse, seega installivad need tavaliselt lõppkasutajad.
Küsimus 6: Mis on Java kogumiklassid ja milleks neid kasutatakse?
Java keeles viitab termin „kogumiklass” tavaliselt klassidele, mis kuuluvad Java Collections Frameworki. See raamistik pakub standardiseeritud viisi objektide rühmade salvestamiseks, organiseerimiseks ja manipuleerimiseks. See koosneb erinevatest liidestest ja andmestruktuuride konkreetsetest rakendustest.
Kogumisklasse kasutatakse mitmesugustel eesmärkidel:
- Andmete organiseerimine: võimaldavad andmeid tõhusalt organiseerida nimekirjadesse, kogumitesse või kaartidesse.
- Andmete manipuleerimine: need pakuvad meetodeid elementide lisamiseks, eemaldamiseks ja otsimiseks.
- Üldine programmeerimine: Üldiste tüüpide kasutamine kogumikklassides võimaldab luua taaskasutatavat ja tüübikindlat koodi.
- Algoritmid: raamistik sisaldab ka algoritme, mis töötlevad andmestruktuure (nt sorteerimine või otsimine).
Küsimus 7: Mis vahe on Java keeles numbritel == ja equals()?
== ja equals() on kaks erinevat mehhanismi või operaatorit, mida kasutatakse objektide võrdlemiseks:
- Operaator
==võrdleb objektide viiteid, mitte nende sisu väärtusi. Objekti puhul kontrollib==, kas kaks viidet osutavad samale objektile (st kas nad viitavad samale mälupiirkonnale). Seevastu primitiivsete andmetüüpide puhul (nt char, int või byte) võrdleb operaator väärtusi. - Operaatoriga
equals()saab võrrelda objektide sisu, et kindlaks teha, kas objektid on samad, isegi kui need asuvad erinevates mälupiirkondades. Vaikimisi käitubequals()nagu==, pärides viite võrdlemise loogika klassist Object. Siiski tuleb seda tavaliselt kasutaja määratud klassides ümber kirjutada, et võimaldada sisulist sisu võrdlemist.
Küsimus 8: Milleks kasutatakse konstruktoreid?
Konstruktorid on klassi sees olevad spetsiaalsed meetodid, mida kasutatakse objektide instantsieerimiseks ja initsialiseerimiseks. Konstruktorite neli peamist ülesannet on:
- Objekti algseadistamine: Konstruktoreid kasutatakse peamiselt selleks, et viia objekt kohe pärast loomist kehtivasse ja algseadistatud olekusse. Algseadistatakse atribuudid ja eraldatakse vajalikud ressursid.
- Parameetrite edastamine: Konstruktorid võivad vastu võtta parameetreid, et luua klassi erinevaid instantsi erinevate omadustega, võimaldades luua objekte spetsiifiliste atribuudi väärtustega.
- Koodi haldamine: Konstruktorite kasutamine parandab koodi loetavust, kuna objekti initsialiseerimine saab toimuda otse konstruktoris. See lihtsustab ka koodi hooldust, kuna initsialiseerimise loogika muudatusi tuleb teha ainult ühes kohas.
- Pärimine: Konstruktorid mängivad olulist rolli pärimishierarhias. Tuletatud klass kutsub tavaliselt baasklassi konstruktori, et käsitleda selle initsialiseerimist enne omaenda initsialiseerimiste tegemist.
Küsimus 9: Java kasutab mitmeid erinevaid string-tüüpe. Millised need on ja kuidas nad üksteisest erinevad?
Java-keeles esindab string-tüüpi klass java.lang.String. See klass on peamine viis märgijadade esindamiseks. Samuti pakub see mitmesuguseid võimalusi stringide manipuleerimiseks ja töötlemiseks:
- StringBuilder: Seda klassi kasutatakse Java-s muudetavate stringide tõhusaks loomiseks. Erinevalt muutumatust String-klassist võimaldab see teha muudatusi ilma uut instantsi loomata.
- String-literaal: See viitab kahekordsete jutumärkidega kirjutatud märgijadadele, näiteks
"Nice to see you!". Identsed string-literaalid jagavad ühte instantsi string-poolis, et optimeerida mälu kasutamist. - String-objektid: Neid saab luua uue instantsina, kasutades märksõna
new, näiteksnew string ("Nice to see you!"). Instants luuakse sõltumatult sisust. - StringBuffer: Nagu StringBuilder, loob ka see klass muudetavaid stringe. Peamine erinevus on selles, et StringBuffer on thread-safe, StringBuilder aga mitte.
Küsimus 10: Mis eristab throw throws?
Java keeles kasutatakse märksõnu throw ja throws mõlemat erandite käsitlemiseks. Sarnasusest hoolimata on neil erinevad eesmärgid ja neid kasutatakse erinevates kontekstides:
throwkasutatakse erandite käsitsi tekitamiseks. Arendajad saavad seda kasutada erandite tekitamiseks ja nende edastamiseks kutsuvale programmile.- Seevastu
throwsnäitab, et meetod on võimeline tekitama konkreetse erandit. Seda kasutatakse meetodi deklaratsioonis, et täpsustada, milliseid erandeid meetod ei saa käsitleda, vaid edastab need käsitlemiseks kutsujale, võimaldades koodil vastavalt reageerida.