Java Intervju Spørsmål

1. Introduksjon

Denne artikkelen inneholder svar på noen av de viktigste spørsmålene om jobbintervju om kjernen i Java. Svarene på noen av dem er kanskje ikke åpenbare, så denne artikkelen vil bidra til å rydde opp i ting.

2. Core-Java språkspørsmål for nybegynnere

Q1. Blir data gitt ved referanse eller etter verdi i Java?

Selv om svaret på dette spørsmålet er ganske enkelt, kan dette spørsmålet være forvirrende for nybegynnere. La oss først avklare hva spørsmålet handler om:

  1. Passer etter verdi - det betyr at vi passerer en kopi av et objekt som parameter inn i en metode.
  2. Bestått av referanse - det betyr at vi passerer en referanse til et objekt som parameter inn i en metode.

For å svare på spørsmålet må vi analysere to tilfeller. De representerer to typer data som vi kan overføre til en metode: en primitiv og en gjenstand.

Når vi overfører primitiver til en metode, blir verdien kopiert til en ny variabel. Når det gjelder objekter, blir verdien av referansen kopiert til en ny variabel. Så vi kan si at Java er et strengt forbipasseringsverdi Språk.

Vi kan lære mer om det i en av artiklene våre: Pass-By-Value as a Parameter Passing Mechanism in Java.

Q2. Hva er forskjellen mellom import og statisk import?

Vi kan bruke vanlig import til å importere en bestemt klasse eller alle klasser som er definert i en annen pakke:

importere java.util.ArrayList; // spesifikk klasseimport java.util. *; // alle klasser i util-pakke

Vi kan også bruke dem til å importere offentlige nestede klasser av en omsluttende klasse:

importer com.baeldung.A. *

Vi bør imidlertid være klar over at importen ovenfor ikke importerer klassen EN seg selv.

Det er også statisk import som gjør det mulig for oss å importere statiske medlemmer eller nestede klasser:

importer statisk java.util.Collections.EMPTY_LIST;

Effekten er at vi kan bruke den statiske variabelen EMPTY_LIST uten å forutse det fullt kvalifiserte klassenavnet, dvs. som om det ble erklært i gjeldende klasse.

Q3. Hvilke tilgangsmodifikatorer er tilgjengelige i Java, og hva er formålet med dem?

Det er fire tilgangsmodifikatorer i Java:

  1. privat
  2. misligholde (pakke)
  3. beskyttet
  4. offentlig

De privat modifier forsikrer at klassemedlemmer ikke vil være tilgjengelige utenfor klassen. Den kan brukes på metoder, egenskaper, konstruktører, nestede klasser, men ikke på toppnivåklasser selv.

i motsetning til privat modifikator, kan vi bruke misligholde modifikator for alle typer klassemedlemmer og til selve klassen. Vi kan søke misligholde synlighet ved ikke å legge til noen tilgangsmodifikatorer i det hele tatt. Hvis vi bruker misligholde synlighet vår klasse eller dens medlemmer vil bare være tilgjengelig i pakken for klassen vår. Vi bør huske på at standard tilgangsmodifikator ikke har noe til felles med misligholde nøkkelord.

På samme måte som misligholde modifikator, har alle klasser i en pakke tilgang beskyttet medlemmer. Hva mer, den beskyttet modifier gir underklasser tilgang til de beskyttede medlemmene i en superklasse, selv om de ikke er innenfor samme pakke. Vi kan ikke bruke denne tilgangsmodifikatoren på klasser, bare på klassemedlemmer.

De offentlig modifier kan brukes sammen med klassens søkeord og alle klassemedlemmer. Det gjør klasser og klassemedlemmer tilgjengelige i alle pakker og i alle klasser.

Vi kan lære mer i Java Access Modifiers artikkelen.

Q4. Hvilke andre modifikatorer er tilgjengelige i Java, og hva er formålet med dem?

Det er fem andre modifikatorer tilgjengelig i Java:

  • statisk
  • endelig
  • abstrakt
  • synkronisert
  • flyktige

Disse styrer ikke synligheten.

Først av alt kan vi bruke statisk nøkkelord til felt og metoder. Statiske felt eller metoder er klassemedlemmer, mens ikke-statiske felt er objektmedlemmer. Klassemedlemmer trenger ikke noen forekomst for å bli påkalt. De kalles med klassenavnet i stedet for objektets referansenavn. Denne artikkelen går nærmere inn på statisk nøkkelord.

Så har vi endelig nøkkelord. Vi kan bruke den med felt, metoder og klasser. Når endelig brukes på et felt, betyr det at feltreferansen ikke kan endres. Så det kan ikke tildeles til et annet objekt. Når endelig brukes på en klasse eller en metode, forsikrer den oss om at den klassen eller metoden ikke kan utvides eller overstyres. De endelig nøkkelord er forklart mer detaljert i denne artikkelen.

Det neste nøkkelordet er abstrakt. Denne kan beskrive klasser og metoder. Når klasser er abstrakt, de kan ikke instantieres. I stedet er de ment å bli underklassert. Når metoder er det abstrakt, de er igjen uten implementering, og de kan overstyres i underklasser.

De synkronisert søkeord kan være det mest avanserte. Vi kan bruke den med forekomsten så vel som med statiske metoder og kodeblokker. Når vi bruker dette nøkkelordet, får vi Java til å bruke en skjermlås for å gi synkronisering på et gitt kodefragment. Mer informasjon om synkronisert finner du i denne artikkelen.

Det siste nøkkelordet vi skal diskutere er flyktige. Vi kan bare bruke den sammen med forekomstfelt. Den erklærer at feltverdien må leses fra og skrives til hovedminnet - utenom CPU-hurtigbufferen. Alt som leses og skrives for en flyktig variabel er atomisk. Det flyktige nøkkelordet er forklart i detalj i denne artikkelen.

Q5. Hva er forskjellen mellom JDK, JRE og JVM?

JDK står for Java utviklingssett, som er et sett med verktøy som er nødvendige for utviklere for å skrive applikasjoner i Java. Det er tre typer JDK-miljøer:

  • Standard Edition - utviklingssett for å lage bærbare desktop- eller serverapplikasjoner
  • Enterprise Edition - en utvidelse til Standard Edition med støtte for distribuert databehandling eller webtjenester
  • Micro Edition - utviklingsplattform for innebygde og mobile applikasjoner

Det er mange verktøy inkludert i JDK som hjelpe programmerere med å skrive, feilsøke eller vedlikeholde applikasjoner. De mest populære er en kompilator (javac), en tolk (java), en arkiver (krukke) og en dokumentasjonsgenerator (javadoc).

JRE er en Java Runtime Environment. Det er en del av JDK, men den inneholder minimum funksjonalitet for å kjøre Java-applikasjoner. Den består av en Java Virtual Machine, kjerneklasser og støttefiler. For eksempel har den ingen kompilator.

JVM er forkortelsen for Java Virtual Machine, som er en virtuell maskin som kan kjøre programmer som er samlet til bytecode. Det er beskrevet av JVM-spesifikasjonen, da det er viktig å sikre interoperabilitet mellom forskjellige implementeringer. Den viktigste funksjonen til en JVM er å gjøre det mulig for brukere å distribuere den samme Java-applikasjonen i forskjellige operativsystemer og miljøer uten å bekymre seg for hva som ligger under.

For mer informasjon, la oss sjekke forskjellen mellom JVM, JRE og JDK-artikkelen.

Q6. Hva er forskjellen mellom stack og haug?

Det er to deler av minnet der alle variabler og objekter er lagret av JVM. Den første er stable og det andre er haug.

De stable er et sted der JVM reserverer blokker for lokale variabler og tilleggsdata. Bunken er en LIFO (sist inn først ut) struktur. Det betyr at når en metode kalles, er en ny blokk reservert for lokale variabler og objektreferanser. Hver påkallelse av nye metoder forbeholder seg neste blokk. Når metoder er ferdige med utførelsen, frigjøres blokker på den omvendte måten de ble startet på.

Hver nye tråd har sin egen stabel.

Vi bør være klar over at stabelen har mye mindre minne enn bunken. Og når en bunke er full, vil JVM kaste en StackOverflowError. Det vil sannsynligvis oppstå når det er en dårlig rekursiv samtale og rekursjonen går for dypt.

Hvert nytt objekt blir opprettet på Java heap som brukes til en dynamisk tildeling. Det er en garbage samler som er ansvarlig for å slette ubrukte gjenstander som er delt inn i unge (barnehage) og gamle rom. Minnetilgang til dyngen er tregere enn tilgangen til bunken. JVM kaster en OutOfMemoryError når haugen er full.

Vi kan finne flere detaljer i Stack Memory and Heap Space in Java-artikkelen.

Q7. Hva er forskjellen mellom Sammenlignelig og Komparator Grensesnitt?

Noen ganger når vi skriver en ny klasse, vil vi gjerne kunne sammenligne objekter fra den klassen. Det er spesielt nyttig når vi vil bruke sorterte samlinger. Det er to måter vi kan gjøre dette på: med Sammenlignelig grensesnitt eller med Komparator grensesnitt.

La oss først se på Sammenlignelig grensesnitt:

offentlig grensesnitt Comparable {int CompareTo (T var1); }

Vi bør implementere det grensesnittet av klassen hvis objekter vi vil sortere.

Den har sammenligne med() metode og returnerer et helt tall. Den kan returnere tre verdier: -1, 0 og 1, noe som betyr at dette objektet er mindre enn, lik eller større enn det sammenlignede objektet.

Det er verdt å nevne at overstyrt sammenlignT0 () metoden skal være i samsvar med er lik() metode.

På den annen side kan vi bruke Komparator grensesnitt. Det kan overføres til sortere() metoder for Samling grensesnitt eller når du sorterer sorterte samlinger. Derfor brukes det mest til å lage en engangs sorteringsstrategi.

Dessuten er det også nyttig når vi bruker en tredjepartsklasse som ikke implementerer det sammenlignbare grensesnittet.

Som sammenligne med() metoden, den overstyrte sammenligne() metodene skal være i samsvar med er lik() metode, men de kan valgfritt tillate sammenligning med null.

La oss besøke Comparator and Comparable in Java-artikkelen for mer informasjon.

Q8. Hva er tomrom Type og når bruker vi den?

Hver gang vi skriver en metode i Java, må den ha en returtype. Hvis vi vil at metoden ikke skal gi noen verdi, kan vi bruke tomrom nøkkelord.

Vi bør også vite at det er en Tomrom klasse. Det er en plassholderklasse som kan brukes for eksempel når du arbeider med generiske legemidler. De Tomrom klasse kan verken instantiseres eller utvides.

Q9. Hva er metodene for objektklassen og hva gjør de?

Det er viktig å vite hvilke metoder Gjenstand klassen inneholder og hvordan de fungerer. Det er også veldig nyttig når vi vil overstyre disse metodene:

  • klone () - returnerer en kopi av dette objektet
  • er lik() - kommer tilbake ekte når dette objektet er lik objektet som er sendt som parameter
  • fullfør () - søppeloppsamleren kaller denne metoden mens den rengjør minnet
  • getClass () - returnerer kjøretidsklassen til dette objektet
  • hashCode () - returnerer en hash-kode for dette objektet. Vi bør være klar over at det skal være i samsvar med er lik() metode
  • gi beskjed() - sender et varsel til en enkelt tråd som venter på objektets skjerm
  • notifyAll () - sender et varsel til alle tråder som venter på objektets skjerm
  • toString () - returnerer en strengrepresentasjon av dette objektet
  • vente() - det er tre overbelastede versjoner av denne metoden. Det tvinger den gjeldende tråden til å vente den angitte tiden til en annen tråd ringer gi beskjed() eller notifyAll () på dette objektet.

Q10. Hva er en Enum, og hvordan kan vi bruke den?

Enum er en type klasse som lar utviklere spesifisere et sett med forhåndsdefinerte konstante verdier. For å lage en slik klasse må vi bruke enum nøkkelord. La oss forestille oss et enum av ukedagene:

offentlig enum Dag {SØNDAG, MANDAG, TIRSDAG, ONSDAG, TORSDAG, FREDAG, LØRDAG}

For å gjenta over alle konstanter kan vi bruke det statiske verdier () metode. Dessuten gjør enums oss i stand til å definere medlemmer som egenskaper og metoder som vanlige klasser.

Selv om det er en spesiell type klasse, kan vi ikke underklasse den. Et enum kan imidlertid implementere et grensesnitt.

En annen interessant fordel med Enums er at de er trådsikre, og så blir de populært brukt som singler.

Vi kan finne mer om Enums i en av våre guider.

Q11. Hva er en KRUKKE?

KRUKKE er en snarvei for Java arkiv. Det er en arkivfil pakket med ZIP-filformat. Vi kan bruke den til å inkludere klassefiler og tilleggsressurser som er nødvendige for applikasjoner. Den har mange funksjoner:

  • Sikkerhet - vi kan signere JAR-filer digitalt
  • Komprimering - mens vi bruker en JAR, kan vi komprimere filer for effektiv lagring
  • Bærbarhet - vi kan bruke den samme JAR-filen på flere plattformer
  • Versjonering - JAR-filer kan inneholde metadata om filene de inneholder
  • Tetting - vi kan forsegle en pakke i en JAR-fil. Dette betyr at alle klasser fra en pakke må inkluderes i samme JAR-fil
  • Utvidelser - vi kan bruke JAR-filformatet til å pakke moduler eller utvidelser for eksisterende programvare

Q12. Hva er enNullPointerException?

De NullPointerException er sannsynligvis det vanligste unntaket i Java-verdenen. Det er et ukontrollert unntak og utvides dermed RuntimeException. Vi skal ikke prøve å takle det.

Dette unntaket blir kastet når vi prøver å få tilgang til en variabel eller kaller en metode for null referanse, som når:

  • påkalle en metode for null referanse
  • sette eller få et felt med null referanse
  • sjekke lengden på en null matrisereferanse
  • innstilling eller henting av et element i en null array-referanse
  • kaste null

Q13. Hva er to typer casting i Java? Hvilket unntak kan kastes mens du støper? Hvordan kan vi unngå det?

Vi kan skille mellom to typer avstøpning i Java. Vi kan gjøre upcasting som kaster et objekt til en supertype eller downcasting som kaster et objekt til en undertype.

Upcasting er veldig enkelt, som vi alltid kan gjøre det. For eksempel kan vi upcast a String eksempel til Gjenstand type:

Objekt str = "streng";

Alternativt kan vi nedslått en variabel. Det er ikke så trygt som oppkast som det innebærer en typekontroll. Hvis vi feilstøper et objekt, vil JVM kaste et ClassCastExcpetion ved kjøretid. Heldigvis kan vi bruke tilfelle av nøkkelord for å forhindre ugyldig casting:

Objekt o = "streng"; String str = (String) o; // det er ok Objekt o2 = nytt objekt (); String str2 = (String) o2; // ClassCastException blir kastet hvis (o2 forekomst av streng) {// returnerer falsk streng str3 = (streng) o2; }

Vi kan lære mer om typestøping i denne artikkelen.

3. Core-Java språkspørsmål for avanserte programmerere

Q1. Hvorfor er streng en uforanderlig klasse?

Vi burde vite det String gjenstander behandles annerledes enn andre gjenstander av JVM. En forskjell er at String gjenstander er uforanderlige. Det betyr at vi ikke kan endre dem når vi har opprettet dem. Det er flere grunner til at de oppfører seg slik:

  1. De lagres i strengbasseng som er en spesiell del av heapminnet. Det er ansvarlig for å spare mye plass.
  2. Uforanderligheten til String klasse garanterer at hash-koden ikke endres. På grunn av det faktum, Strenger kan effektivt brukes som nøkler i hashing-samlinger. Vi kan være sikre på at vi ikke overskriver data på grunn av endring i hash-koder.
  3. De kan brukes trygt på tvers av flere tråder. Ingen tråd kan endre verdien på en String objekt, så vi får trådsikkerhet gratis.
  4. Strenger er uforanderlige for å unngå alvorlige sikkerhetsproblemer. Sensitive data som passord kan endres av en upålitelig kilde eller en annen tråd.

Vi kan lære mer om uforanderligheten til strenger i denne artikkelen.

Q2. Hva er forskjellen mellom dynamisk binding og statisk binding?

Binding i Java er en prosess for å knytte en metodeanrop til riktig metodekropp. Vi kan skille mellom to typer innbinding i Java: statisk og dynamisk.

Hovedforskjellen mellom statisk binding og dynamisk binding er at statisk binding skjer ved kompileringstid og dynamisk binding ved kjøretid.

Statisk binding bruker klasseinformasjon for binding. Det er ansvarlig for å løse klassemedlemmer som er privat eller statisk og endelig metoder og variabler. Dessuten binder statisk binding overbelastede metoder.

Dynamisk bindingderimot, bruker objektinformasjon for å løse bindinger. Derfor er det ansvarlig for å løse virtuelle og overstyrte metoder.

Q3. Hva er JIT?

JIT står for "just in time". Det er en komponent i JRE som kjører i kjøretiden og øker ytelsen til applikasjonen. Spesielt er det en kompilator som kjører like etter programmets start.

Dette er forskjellig fra den vanlige Java-kompilatoren som kompilerer koden lenge før applikasjonen startes. JIT kan øke hastigheten på applikasjonen på forskjellige måter.

For eksempel er JIT-kompilatoren ansvarlig for å kompilere bytekode til innfødte instruksjoner på farten for å forbedre ytelsen. Det kan også optimalisere koden til målrettet CPU og operativsystem.

I tillegg har den tilgang til mange kjøretidsstatistikker som kan brukes til rekompilering for optimal ytelse. Med dette kan det også gjøre noen globale kodeoptimaliseringer eller omorganisere kode for bedre cacheutnyttelse.

Q4. Hva er refleksjon i Java?

Refleksjon er en veldig kraftig mekanisme i Java. Refleksjon er en mekanisme for Java-språk som gjør det mulig for programmerere å undersøke eller modifisere den interne tilstanden til programmet (egenskaper, metoder, klasser osv.) Ved kjøretid. Pakken java.lang.reflect inneholder alle nødvendige komponenter for bruk av refleksjon.

Når du bruker denne funksjonen, kan vi få tilgang til alle mulige felt, metoder, konstruktører som er inkludert i en klassedefinisjon. Vi har tilgang til dem uavhengig av tilgangsmodifikator. Det betyr at vi for eksempel har tilgang til private medlemmer. For å gjøre det, trenger vi ikke å vite navnene deres. Alt vi trenger å gjøre er å bruke noen statiske metoder for Klasse.

Det er verdt å vite at det er en mulighet for å begrense tilgangen via refleksjon. For å gjøre det kan vi bruke Java-sikkerhetsbehandling og Java-sikkerhetspolicyfilen. De tillater oss å gi tillatelser til klasser.

Når vi jobber med moduler siden Java 9, bør vi vite at vi som standard ikke kan bruke refleksjon over klasser importert fra en annen modul. For å la andre klasser bruke refleksjon for å få tilgang til de private medlemmene av en pakke, må vi gi "Refleksjon" Tillatelse.

Denne artikkelen går nærmere inn på Java Reflection.

Q5. Hva er en Klasselaster?

De klasselaster er en av de viktigste komponentene i Java. Det er en del av JRE.

Enkelt sagt, den klasselaster er ansvarlig for å laste klasser inn i JVM. Vi kan skille mellom tre typer klasselastere:

  • Bootstrap klasselaster - det laster kjernen Java-klasser. De ligger i / jre / lib katalog
  • Utvidelse klasselaster - den laster klasser som ligger i / jre / lib / ekst eller i banen definert av java.ext.dirs eiendom
  • System klasselaster - den laster klasser på klassestien til søknaden vår

En klasselaster laster klasser "på forespørsel". Det betyr at klasser lastes inn etter at de blir kalt av programmet. I tillegg kan en klasselaster laste en klasse med et gitt navn bare én gang. Men hvis den samme klassen er lastet av to forskjellige klasselastere, mislykkes disse klassene i en likhetskontroll.

Det er mer informasjon om klasselastere i Class Loaders in Java-artikkelen.

Q6. Hva er forskjellen mellom statisk og dynamisk klasseinnlasting?

Statisk klasselasting foregår når vi har kildeklasser tilgjengelig på kompileringstidspunktet. Vi kan bruke det ved å lage objektforekomster med ny nøkkelord.

Dynamisk klasselasting refererer til en situasjon når vi ikke kan gi en klassedefinisjon på kompileringstidspunktet. Likevel kan vi gjøre det på kjøretid. For å lage en forekomst av en klasse, må vi bruke Class.forName () metode:

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

Q7. Hva er formålet med Serialiserbar Grensesnitt?

Vi kan bruke Serialiserbar grensesnitt for å muliggjøre seriellisering av en klasse ved hjelp av Java's Serialization API. Serialisering er en mekanisme for å lagre tilstanden til et objekt som en bytesekvens, mens deserialisering er en mekanisme for å gjenopprette tilstanden til et objekt fra en bytesekvens. Den serielle utgangen har objektets tilstand og noen metadata om objektets type og felttyper.

Vi bør vite at undertyper av serieiserbare klasser også kan serienummeres. Imidlertid, hvis vi vil lage en klasse som kan serialiseres, men supertypen ikke kan serialiseres, må vi gjøre to ting:

  • implementere Serialiserbar grensesnitt
  • forsikre deg om at en konstruktør uten argument er til stede i superklassen

Vi kan lese mer om serialisering i en av artiklene våre.

Q8. Er det en ødelegger i Java?

I Java sletter søppeloppsamleren automatisk de ubrukte objektene for å frigjøre minnet. Utviklere har ikke behov for å merke objektene for sletting, noe som er feilutsatt. Så det er fornuftig at Java ikke har noen destruktorer tilgjengelig.

Hvis objektene holder åpne stikkontakter, åpne filer eller databaseforbindelser, søppeloppsamleren er ikke i stand til å gjenvinne disse ressursene. Vi kan frigjøre ressursene i Lukk metode og bruk prøv-endelig syntaks for å ringe metoden etterpå før Java 7, for eksempel I / O-klassene FileInputStreamog FileOutputStream. Fra og med Java 7 kan vi implementere grensesnitt Kan lukkes automatisk og bruk prøv-med-ressurser uttalelse for å skrive kortere og renere kode. Men det er mulig API-brukerne glemmer å ringe til Lukk metoden, så fullføre metode og Renere klasse oppstår for å fungere som sikkerhetsnett. Men vær forsiktig, de tilsvarer ikke ødeleggeren.

Det er ikke forsikret begge deler sluttfør metode og Renere klassen vil kjøre raskt. De får til og med ingen sjanse til å løpe før JVM går ut. Selv om vi kunne ringe System.runFinalization å foreslå at JVM kjører fullføre metoder for gjenstander som venter på å bli avsluttet, er det fremdeles ikke-deterministisk.

Videre, den fullføre metoden kan forårsake ytelsesproblemer, fastlåsning osv. Vi kan finne mer informasjon ved å se på en av artiklene våre: En guide til å fullføre metoden i Java.

Fra og med Java 9, Renere klasse er lagt til for å erstatte fullføre metode på grunn av ulempene den har. Som et resultat har vi bedre kontroll over tråden som gjør rengjøringshandlingene.

Men java-spesifikasjonen peker på oppførselen til rengjøringsmidler under System.exit er implementeringsspesifikk, og Java gir ingen garantier for om rengjøring vil bli påkalt eller ikke.


$config[zx-auto] not found$config[zx-overlay] not found