Java 8 intervjuspørsmål (+ svar)

Denne artikkelen er en del av en serie: • Java Collections Interview Questions

• Java Type System Interview Questions

• Java-samtalespørsmål om samtidighet (+ svar)

• Spørsmål om Java-klassestruktur og initialisering

• Java 8 intervjuspørsmål (+ svar) (nåværende artikkel) • minnehåndtering i Java-intervjuspørsmål (+ svar)

• Java Generics intervjuspørsmål (+ svar)

• Intervju med Java Flow Control (+ svar)

• Java-unntaksspørsmål (+ svar)

• Spørsmål om Java-merknader (+ svar)

• Spørsmål om topp vårrammeverk

1. Introduksjon

I denne artikkelen skal vi utforske noen av de JDK8-relaterte spørsmålene som kan dukke opp under et intervju.

Java 8 er en plattformutgivelse fullpakket med nye språkfunksjoner og biblioteklasser. De fleste av disse nye funksjonene er rettet mot å oppnå renere og mer kompakt kode, og noen legger til ny funksjonalitet som aldri har blitt støttet i Java.

2. Java 8 Generell kunnskap

Q1. Hvilke nye funksjoner ble lagt til i Java 8?

Java 8 leveres med flere nye funksjoner, men de viktigste er følgende:

  • Lambda Expressions - en ny språkfunksjon som tillater behandling av handlinger som objekter
  • Metode Referanser - muliggjøre definering av Lambda-uttrykk ved å referere til metoder som bruker navnene deres direkte
  • Valgfri - spesiell innpakningsklasse brukt til å uttrykke valgfrihet
  • Funksjonelt grensesnitt - et grensesnitt med maksimalt en abstrakt metode, implementering kan gis ved hjelp av et Lambda-uttrykk
  • Standardmetoder - gi oss muligheten til å legge til fullstendige implementeringer i grensesnitt i tillegg til abstrakte metoder
  • Nashorn, JavaScript-motor - Java-basert motor for å utføre og evaluere JavaScript-kode
  • Strøm API - en spesiell iteratorklasse som tillater behandling av samlinger av objekter på en funksjonell måte
  • Date API - en forbedret, uforanderlig JodaTime-inspirert Date API

I tillegg til disse nye funksjonene gjøres mange forbedringer av funksjonen under panseret, både på kompilator- og JVM-nivå.

3. Metode Referanser

Q1. Hva er en metodehenvisning?

En metodehenvisning er en Java 8-konstruksjon som kan brukes til å referere til en metode uten å påkalle den. Den brukes til å behandle metoder som Lambda-uttrykk. De fungerer bare som syntaktisk sukker for å redusere detaljnivået til noen lambdas. På denne måten, følgende kode:

(o) -> o.toString ();

kan bli:

Objekt :: toString ();

En metodehenvisning kan identifiseres ved et dobbelt kolon som skiller et klasse- eller objektnavn og navnet på metoden. Den har forskjellige varianter, for eksempel konstruktørreferanse:

String :: ny;

Statisk metodehenvisning:

String :: valueOf;

Bundet forekomst metode referanse:

str :: toString;

Ubundet forekomst metode referanse:

String :: toString;

Du kan lese en detaljert beskrivelse av metodereferanser med fulle eksempler ved å følge denne lenken og denne.

Q2. Hva er meningen med streng :: Valueof Expression?

Det er en statisk metodehenvisning til verdien av metoden for String klasse.

4. Valgfritt

Q1. Hva er Valgfri? Hvordan kan det brukes?

Valgfri er en ny klasse i Java 8 som innkapsler en valgfri verdi, dvs. en verdi som enten er der eller ikke. Det er en omvikling rundt et objekt, og du kan tenke på det som en beholder med null eller ett element.

Valgfri har en spesiell Valgfritt. Lett () verdi i stedet for pakket inn null. Dermed kan den brukes i stedet for en nullverdi å bli kvitt NullPointerException i mange tilfeller.

Du kan lese en dedikert artikkel om Valgfri her.

Hovedformålet med Valgfri, som designet av skaperne, skulle være en type returmetoder som tidligere ville komme tilbake null. Slike metoder vil kreve at du skriver kokkel for å sjekke returverdien, og noen ganger kan du glemme å gjøre en defensiv sjekk. I Java 8, an Valgfri return type krever eksplisitt at du håndterer null eller ikke-null innpakket verdier forskjellig.

For eksempel Stream.min () metoden beregner minimumsverdien i en strøm av verdier. Men hva om strømmen er tom? Hvis det ikke var for Valgfri, ville metoden komme tilbake null eller kaste et unntak.

Men det returnerer en Valgfri verdi som kan være Valgfritt. Lett () (den andre saken). Dette gjør at vi enkelt kan håndtere slike tilfeller:

int min1 = Arrays.stream (new int [] {1, 2, 3, 4, 5}) .min () .orElse (0); assertEquals (1, min1); int min2 = Arrays.stream (new int [] {}) .min () .orElse (0); assertEquals (0, min2); 

Det er verdt å merke seg det Valgfri er ikke en generell klasse som Alternativ i Scala. Det anbefales ikke å brukes som feltverdi i enhetsklasser, noe som tydelig er indikert av at den ikke implementerer Serialiserbar grensesnitt.

5. Funksjonelle grensesnitt

Q1. Beskriv noen av de funksjonelle grensesnittene i standardbiblioteket.

Det er mange funksjonelle grensesnitt i java.util.funksjon pakken, inkluderer de vanligste, men ikke begrenset til:

  • Funksjon - det tar ett argument og returnerer et resultat
  • Forbruker - det tar ett argument og gir ikke noe resultat (representerer en bivirkning)
  • Leverandør - det krever ikke argument og returnerer et resultat
  • Predikere - det tar ett argument og returnerer en boolsk
  • BiFunction - det tar to argumenter og returnerer et resultat
  • BinaryOperator - det ligner på en BiFunction, tar to argumenter og returnerer et resultat. De to argumentene og resultatet er av samme type
  • UnaryOperator - det ligner på en Funksjon, tar et enkelt argument og returnerer et resultat av samme type

For mer informasjon om funksjonelle grensesnitt, se artikkelen “Funksjonelle grensesnitt i Java 8”.

Q2. Hva er et funksjonelt grensesnitt? Hva er reglene for å definere et funksjonelt grensesnitt?

Et funksjonelt grensesnitt er et grensesnitt med ikke mer, ikke mindre, men en enkelt abstrakt metode (misligholde metoder teller ikke).

Der en forekomst av et slikt grensesnitt er nødvendig, kan et Lambda-uttrykk brukes i stedet. Mer formelt: Funksjonelle grensesnitt gi måltyper for lambdauttrykk og metodereferanser.

Argumentene og returtypen for et slikt uttrykk samsvarer direkte med argumentene til den enkle abstrakte metoden.

For eksempel Kjørbar grensesnitt er et funksjonelt grensesnitt, så i stedet for:

Trådtråd = ny tråd (ny Runnable () {public void run () {System.out.println ("Hello World!");}});

du kan ganske enkelt gjøre:

Trådtråd = ny tråd (() -> System.out.println ("Hello World!"));

Funksjonelle grensesnitt er vanligvis merket med @FunctionalInterface kommentar - som er informativ og ikke påvirker semantikken.

6. Standardmetode

Q1. Hva er en standardmetode, og når bruker vi den?

En standardmetode er en metode med en implementering - som finnes i et grensesnitt.

Vi kan bruke en standardmetode for å legge til en ny funksjonalitet i et grensesnitt mens vi opprettholder bakoverkompatibilitet med klasser som allerede implementerer grensesnittet:

offentlig grensesnitt Vehicle {public void move (); standard ugyldig hoot () {System.out.println ("peep!"); }}

Vanligvis, når en ny abstrakt metode legges til i et grensesnitt, vil alle implementeringsklasser bryte til de implementerer den nye abstrakte metoden. I Java 8 har dette problemet blitt løst ved bruk av standardmetoden.

For eksempel, Samling grensesnittet ikke har for hver metodedeklarasjon. Dermed vil det å legge til en slik metode ganske enkelt bryte hele samlingens API.

Java 8 introduserer standardmetoden slik at Samling grensesnittet kan ha en standardimplementering av for hver metode uten at klassene som implementerer dette grensesnittet krever at de implementerer det samme.

Q2. Vil følgende kode kompilere?

@FunctionalInterface offentlig grensesnitt Funksjon2 {offentlig V gjelder (T t, U u); standard ugyldighet () {// inkrement counter}}

Ja. Koden vil kompileres fordi den følger den funksjonelle grensesnittspesifikasjonen for å definere bare en enkelt abstrakt metode. Den andre metoden, telle, er en standardmetode som ikke øker antallet abstrakte metoder.

7. Lambda Expressions

Q1. Hva er et Lambda-uttrykk og hva brukes det til

I veldig enkle termer er et lambdauttrykk en funksjon som kan refereres til og sendes rundt som et objekt.

Lambda-uttrykk introduserer funksjonell stilbehandling i Java og letter skriving av kompakt og lettlest kode.

På grunn av dette er lambdauttrykk en naturlig erstatning for anonyme klasser som metodeargumenter. En av deres viktigste bruksområder er å definere integrerte implementeringer av funksjonelle grensesnitt.

Q2. Forklar syntaksen og egenskapene til et Lambda-uttrykk

Et lambdauttrykk består av to deler: parameterdelen og uttrykksdelen atskilt med en pil fremover som nedenfor:

params -> uttrykk

Ethvert lambdauttrykk har følgende egenskaper:

  • Valgfri typedeklarasjon - når vi deklarerer parametrene på venstre side av lambda, trenger vi ikke å erklære typene deres, siden kompilatoren kan utlede dem fra deres verdier. Så int param ->… og param ->… er gyldige
  • Valgfrie parenteser - når bare en parameter er erklært, trenger vi ikke å plassere den i parentes. Dette betyr param ->… og (param) ->… er gyldige. Men når mer enn én parameter er erklært, kreves parentes
  • Valgfrie krøller seler - når uttrykksdelen bare har en enkelt uttalelse, er det ikke behov for krøllete bukseseler. Dette betyr at param -> uttalelse og param -> {uttalelse;} er gyldige. Men krøllete bukseseler er påkrevd når det er mer enn ett utsagn
  • Valgfri returoppgave - når uttrykket returnerer en verdi og den er pakket inn i krøllete bukseseler, trenger vi ikke en returoppgave. Det betyr (a, b) -> {return a + b;} og (a, b) -> {a + b;} er begge gyldige

For å lese mer om Lambda-uttrykk, følg denne lenken og denne.

8. Nashorn Javascript

Q1. Hva er Nashorn i Java8?

Nashorn er den nye Javascript-behandlingsmotoren for Java-plattformen som ble levert med Java 8. Fram til JDK 7 brukte Java-plattformen Mozilla Rhino for samme formål. som en Javascript-behandlingsmotor.

Nashorn gir bedre samsvar med ECMAs normaliserte JavaScript-spesifikasjon og bedre kjøretidsytelse enn forgjengeren.

Q2. Hva er JJS?

I Java 8, jjs er det nye kjørbare eller kommandolinjeverktøyet som brukes til å utføre Javascript-kode på konsollen.

9. Bekker

Q1. Hva er en strøm? Hvordan skiller det seg fra en samling?

Enkelt sagt er en strøm en iterator hvis rolle er å akseptere et sett med handlinger som skal brukes på hvert av elementene den inneholder.

Strømmen representerer en sekvens av objekter fra en kilde, for eksempel en samling, som støtter samlede operasjoner. De ble designet for å gjøre samlebehandlingen enkel og kortfattet. I motsetning til samlingene er logikken til iterasjon implementert inne i strømmen, slik at vi kan bruke metoder som kart og flatMap for å utføre en deklarativ behandling.

En annen forskjell er at Strøm API er flytende og tillater rørledning:

int sum = Arrays.stream (new int [] {1, 2, 3}) .filter (i -> i> = 2) .map (i -> i * 3) .sum ();

Og nok et viktig skille fra samlinger er at bekker iboende er lat lastet og behandlet.

Q2. Hva er forskjellen mellom mellomliggende og terminaloperasjoner?

Strømoperasjoner kombineres i rørledninger for å behandle strømmer. Alle operasjoner er enten mellomliggende eller terminal.

Mellomoperasjoner er de operasjonene som kommer tilbake Strøm selv muliggjør videre operasjoner på en strøm.

Disse operasjonene er alltid late, dvs. de behandler ikke strømmen på anropsstedet, en mellomoperasjon kan bare behandle data når det er en terminaloperasjon. Noen av de mellomliggende operasjonene er filter, kart og flatMap.

Terminaloperasjoner avslutter rørledningen og starter strømbehandling. Strømmen føres gjennom alle mellomoperasjoner under terminaloperasjonsanrop. Terminaloperasjoner inkluderer for hver, redusere, samle og sum.

For å kjøre dette punktet hjem, la oss se på et eksempel med bivirkninger:

public static void main (String [] args) {System.out.println ("Stream uten terminaloperasjon"); Arrays.stream (ny int [] {1, 2, 3}). Kart (i -> {System.out.println ("dobling" + i); return i * 2;}); System.out.println ("Stream med terminaloperasjon"); Arrays.stream (ny int [] {1, 2, 3}). Kart (i -> {System.out.println ("dobling" + i); return i * 2;}). Sum (); }

Resultatet blir som følger:

Stream uten terminaloperasjon Stream med terminaloperasjon dobling 1 dobling 2 dobling 3

Som du ser, blir de mellomliggende operasjonene bare utløst når det eksisterer en terminaloperasjon.

Q3. Hva er forskjellen mellom Kart og flatMap Strømdrift?

Det er forskjell i signatur mellom kart og flatMap. Generelt sett a kart operasjonen bryter returverdien i sin ordinære type mens flatMap gjør ikke.

For eksempel i Valgfri, a kart operasjonen ville komme tilbake Valgfri skriv mens flatMap ville komme tilbake String type.

Så etter kartlegging, må man pakke ut (lese "flate") objektet for å hente verdien, mens det etter flat kartlegging ikke er noe slikt behov da objektet allerede er flat. Det samme konseptet brukes til kartlegging og flat kartlegging i Strøm.

Både kart og flatMap er mellomliggende strømoperasjoner som mottar en funksjon og bruker denne funksjonen på alle elementene i en strøm.

Forskjellen er at for kart, returnerer denne funksjonen en verdi, men for flatMap, returnerer denne funksjonen en strøm. De flatMap operasjonen "flater" strømmen ut i en.

Her er et eksempel der vi tar et kart over brukernes navn og lister over telefoner og "flater" det ned til en liste over telefoner til alle brukerne som bruker flatMap:

Kart folk = nytt HashMap (); people.put ("John", Arrays.asList ("555-1123", "555-3389")); people.put ("Mary", Arrays.asList ("555-2243", "555-5264")); people.put ("Steve", Arrays.asList ("555-6654", "555-3242")); Liste telefoner = people.values ​​(). Stream () .flatMap (Collection :: stream) .collect (Collectors.toList ());

Q4. Hva er Stream Pipelining i Java 8?

Stream pipelining er konseptet med kjededrift sammen. Dette gjøres ved å dele operasjonene som kan skje på en strøm i to kategorier: mellomoperasjoner og terminaloperasjoner.

Hver mellomoperasjon returnerer en forekomst av Stream selv når den kjører, et vilkårlig antall mellomoperasjoner kan derfor settes opp til å behandle data som danner en behandlingsrørledning.

Det må da være en terminaloperasjon som returnerer en endelig verdi og avslutter rørledningen.

10. Java 8 Date and Time API

Q1. Fortell oss om den nye API-en for dato og tid i Java 8

Et langvarig problem for Java-utviklere har vært den utilstrekkelige støtten til dato- og klokkeslettmanipuleringene som vanlige utviklere krever.

De eksisterende klassene som f.eks java.util.Date og SimpleDateFormatter er ikke trådsikre, noe som fører til potensielle problemer med samtidig for brukere.

Dårlig API-design er også en realitet i den gamle Java Data API. Her er bare et raskt eksempel - år inn java.util.Date starter kl 1900, måneder starter kl 1, og dager starter kl 0, som ikke er veldig intuitivt.

Disse utgavene og flere andre har ført til populariteten til tredjeparts dato- og tidsbiblioteker, for eksempel Joda-Time.

For å løse disse problemene og gi bedre støtte i JDK, er en ny API for dato og tid, som er fri for disse problemene, designet for Java SE 8 under pakken java.time.

11. Konklusjon

I denne artikkelen har vi utforsket noen veldig viktige spørsmål for tekniske intervjuspørsmål med en skjevhet på Java 8. Dette er på ingen måte en uttømmende liste, men inneholder bare spørsmål som vi tror mest sannsynlig vil vises i hver nye funksjon på Java 8.

Selv om du nettopp har startet, er uvitenhet om Java 8 ikke en god måte å gå i et intervju på, spesielt når Java vises sterkt på CV-en. Det er derfor viktig at du tar deg litt tid til å forstå svarene på disse spørsmålene og muligens gjøre mer forskning.

Lykke til i intervjuet ditt.

Neste » Minnehåndtering i Java-intervjuspørsmål (+ svar) « Tidligere spørsmål om Java-klassestruktur og initialisering

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