Java 8 Interviewspørgsmål (+ svar)

Denne artikel er en del af en serie: • Interviewsspørgsmål om Java Collections

• Spørgsmål om Java Type System Interview

• Java-spørgsmål om samtidige samtaler (+ svar)

• Interviewspørgsmål om Java-klassestruktur og initialisering

• Java 8 Interviewspørgsmål (+ svar) (nuværende artikel) • Memory Management i Java Interview-spørgsmål (+ svar)

• Interviews med Java Generics (+ svar)

• Interviewspørgsmål til Java Flow Control (+ svar)

• Spørgsmål om Java-undtagelser (+ svar)

• Spørgsmål om Java-annotationer (+ svar)

• Top forårssamarbejdsspørgsmål

1. Introduktion

I denne artikel skal vi udforske nogle af de JDK8-relaterede spørgsmål, der kan dukke op under et interview.

Java 8 er en platformudgivelse fyldt med nye sprogfunktioner og biblioteksklasser. De fleste af disse nye funktioner er rettet mod at opnå renere og mere kompakt kode, og nogle tilføjer ny funktionalitet, der aldrig er blevet understøttet i Java.

2. Java 8 Generel viden

Q1. Hvilke nye funktioner blev tilføjet i Java 8?

Java 8 leveres med flere nye funktioner, men de mest betydningsfulde er følgende:

  • Lambda-udtryk - en ny sprogfunktion, der tillader behandling af handlinger som objekter
  • Metode Referencer - gør det muligt at definere Lambda-udtryk ved at henvise til metoder direkte ved hjælp af deres navne
  • Valgfri - speciel indpakningsklasse, der bruges til at udtrykke optionalitet
  • Funktionelt interface - en grænseflade med maksimalt en abstrakt metode, implementering kan leveres ved hjælp af et Lambda-udtryk
  • Standardmetoder - give os muligheden for at tilføje fulde implementeringer i grænseflader udover abstrakte metoder
  • Nashorn, JavaScript-motor - Java-baseret motor til udførelse og evaluering af JavaScript-kode
  • Strøm API - en særlig iteratorklasse, der tillader behandling af objektsamlinger på en funktionel måde
  • Dato API - en forbedret, uforanderlig JodaTime-inspireret Date API

Sammen med disse nye funktioner udføres der masser af funktionsforbedringer under hætten på både compiler- og JVM-niveau.

3. Metodehenvisninger

Q1. Hvad er en metodehenvisning?

En metodehenvisning er en Java 8-konstruktion, der kan bruges til at henvise til en metode uden at påberåbe sig den. Det bruges til behandling af metoder som Lambda-udtryk. De fungerer kun som syntaktisk sukker for at reducere viden hos nogle lambdas. På denne måde følgende kode:

(o) -> o.toString ();

kan blive:

Objekt :: toString ();

En metodehenvisning kan identificeres ved en dobbelt kolon, der adskiller et klasse- eller objektnavn og metodens navn. Det har forskellige variationer såsom konstruktørreference:

String :: ny;

Statisk metodehenvisning:

String :: valueOf;

Metodehenvisning til bundet forekomst:

str :: toString;

Ubundet forekomst metodehenvisning:

String :: toString;

Du kan læse en detaljeret beskrivelse af metodereferencer med fulde eksempler ved at følge dette link og dette.

Q2. Hvad er meningen med streng :: værdi af udtryk?

Det er en statisk metodehenvisning til Værdi af metode til Snor klasse.

4. Valgfrit

Q1. Hvad er Valgfri? Hvordan kan det bruges?

Valgfri er en ny klasse i Java 8, der indkapsler en valgfri værdi, dvs. en værdi, der enten er der eller ikke. Det er en indpakning omkring et objekt, og du kan tænke på det som en beholder med nul eller et element.

Valgfri har en speciel Valgfri. Let () værdi i stedet for pakket ind nul. Således kan den bruges i stedet for en ugyldig værdi at slippe af med NullPointerException i mange tilfælde.

Du kan læse en dedikeret artikel om Valgfri her.

Hovedformålet med Valgfri, som designet af dets skabere, skulle være en returtype af metoder, der tidligere ville vende tilbage nul. Sådanne metoder ville kræve, at du skrev kedelpladekode for at kontrollere returværdien og nogle gange kunne glemme at lave en defensiv kontrol. I Java 8, en Valgfri return type kræver eksplicit, at du håndterer nul- eller ikke-nul-pakkede værdier forskelligt.

For eksempel Stream.min () metode beregner minimumsværdien i en strøm af værdier. Men hvad nu hvis strømmen er tom? Hvis det ikke var til Valgfri, metoden ville vende tilbage nul eller smid en undtagelse.

Men det returnerer en Valgfri værdi, der kan være Valgfri. Let () (det andet tilfælde). Dette giver os mulighed for let at håndtere en sådan sag:

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

Det er værd at bemærke det Valgfri er ikke en almindelig klasse som Mulighed i Scala. Det anbefales ikke at blive brugt som en feltværdi i enhedsklasser, hvilket tydeligt angives ved, at den ikke implementerer Serialiserbar interface.

5. Funktionelle grænseflader

Q1. Beskriv nogle af de funktionelle grænseflader i standardbiblioteket.

Der er mange funktionelle grænseflader i java.util.function pakken, de mere almindelige inkluderer, men ikke begrænset til:

  • Fungere - det tager et argument og returnerer et resultat
  • Forbruger - det tager et argument og returnerer intet resultat (repræsenterer en bivirkning)
  • Leverandør - det kræver ikke argument og returnerer et resultat
  • Prædikat - det tager et argument og returnerer en boolsk
  • BiFunction - det tager to argumenter og returnerer et resultat
  • BinaryOperator - det ligner en BiFunction, tager to argumenter og returnerer et resultat. De to argumenter og resultatet er alle af de samme typer
  • UnaryOperator - det ligner en Fungere, tager et enkelt argument og returnerer et resultat af samme type

For mere information om funktionelle grænseflader, se artiklen “Funktionelle grænseflader i Java 8”.

Q2. Hvad er en funktionel grænseflade? Hvad er reglerne for definition af en funktionel grænseflade?

En funktionel grænseflade er en grænseflade med ikke mere, ikke mindre, men en enkelt abstrakt metode (Standard metoder tæller ikke med).

Hvor en instans af en sådan grænseflade er påkrævet, kan et Lambda-udtryk bruges i stedet. Mere formelt formuleret: Funktionelle grænseflader give måltyper til lambda-udtryk og metodehenvisninger.

Argumenterne og returtypen af ​​et sådant udtryk svarer direkte til dem, der findes i den enkelte abstrakte metode.

For eksempel Kan køres interface er en funktionel grænseflade, så i stedet for:

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

du kunne simpelthen gøre:

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

Funktionelle grænseflader er normalt kommenteret med @FunktionelInterface kommentar - hvilket er informativt og ikke påvirker semantikken.

6. Standardmetode

Q1. Hvad er en standardmetode, og hvornår bruger vi den?

En standardmetode er en metode med en implementering - som kan findes i en grænseflade.

Vi kan bruge en standardmetode til at tilføje en ny funktionalitet til en grænseflade, mens vi opretholder bagudkompatibilitet med klasser, der allerede implementerer grænsefladen:

offentlig grænseflade Vehicle {public void move (); standard ugyldigt hoot () {System.out.println ("peep!"); }}

Når en ny abstrakt metode føjes til en grænseflade, brydes normalt alle implementeringsklasser, indtil de implementerer den nye abstrakte metode. I Java 8 er dette problem løst ved brug af standardmetoden.

For eksempel, Kollektion interface ikke har for hver metodedeklaration. Således vil tilføjelse af en sådan metode simpelthen bryde hele samlingens API.

Java 8 introducerer standardmetoden, så Kollektion interface kan have en standardimplementering af for hver metode uden at kræve, at de klasser, der implementerer denne grænseflade, implementerer den samme.

Q2. Vil den følgende kode kompilere?

@FunctionalInterface offentlig grænseflade Funktion2 {offentlig V anvend (T t, U u); standard ugyldigt antal () {// stigningstæller}}

Ja. Koden kompileres, fordi den følger den funktionelle grænsefladespecifikation for kun at definere en enkelt abstrakt metode. Den anden metode, tælle, er en standardmetode, der ikke øger antallet af abstrakte metoder.

7. Lambda-udtryk

Q1. Hvad er et Lambda-udtryk, og hvad bruges det til

I meget enkle vendinger er et lambda-udtryk en funktion, der kan henvises til og sendes rundt som et objekt.

Lambda-udtryk introducerer funktionel stilbehandling i Java og letter skrivning af kompakt og letlæselig kode.

På grund af dette er lambda-udtryk en naturlig erstatning for anonyme klasser som metodeargumenter. En af deres vigtigste anvendelser er at definere integrerede implementeringer af funktionelle grænseflader.

Q2. Forklar syntaks og egenskaber ved et Lambda-udtryk

Et lambda-udtryk består af to dele: parameterdelen og udtryksdelen adskilt af en pil fremad som nedenfor:

params -> udtryk

Ethvert lambda-udtryk har følgende egenskaber:

  • Valgfri typedeklaration - når vi erklærer parametrene på venstre side af lambda, behøver vi ikke at erklære deres typer, da kompilatoren kan udlede dem fra deres værdier. Så int param ->… og param ->… er alle gyldige
  • Valgfri parentes - når kun en enkelt parameter er erklæret, behøver vi ikke placere den i parentes. Det betyder param ->… og (param) ->… er alle gyldige. Men når mere end en parameter er erklæret, kræves parenteser
  • Valgfri krøllede seler - når udtryksdelen kun har en enkelt udsagn, er der ikke behov for krøllede seler. Det betyder at param -> erklæring og param -> {udsagn;} er alle gyldige. Men krøllede seler er påkrævet, når der er mere end en erklæring
  • Valgfri returopgørelse - når udtrykket returnerer en værdi, og det er pakket ind i krøllede seler, så har vi ikke brug for en returerklæring. Det betyder (a, b) -> {returner a + b;} og (a, b) -> {a + b;} begge er gyldige

For at læse mere om Lambda-udtryk, følg dette link og dette.

8. Nashorn Javascript

Q1. Hvad er Nashorn i Java8?

Nashorn er den nye Javascript-behandlingsmotor til Java-platformen, der blev leveret med Java 8. Indtil JDK 7 brugte Java-platformen Mozilla Rhino til samme formål. som en Javascript-behandlingsmotor.

Nashorn leverer bedre overholdelse af ECMAs normaliserede JavaScript-specifikation og bedre runtime-ydeevne end sin forgænger.

Q2. Hvad er JJS?

I Java 8, jjs er det nye eksekverbare eller kommandolinjeværktøj, der bruges til at udføre Javascript-kode på konsollen.

9. Strømme

Q1. Hvad er en strøm? Hvordan adskiller det sig fra en samling?

Enkelt sagt er en stream en iterator, hvis rolle er at acceptere et sæt handlinger, der skal anvendes på hvert af de elementer, den indeholder.

Strømmen repræsenterer en sekvens af objekter fra en kilde, såsom en samling, der understøtter samlede operationer. De blev designet til at gøre indsamlingsbehandlingen enkel og kortfattet. I modsætning til samlingerne implementeres iterationens logik inde i strømmen, så vi kan bruge metoder som kort og flatMap til udførelse af en deklarativ behandling.

En anden forskel er, at Strøm API er flydende og tillader pipelining:

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

Og endnu en vigtig skelnen fra samlinger er, at vandløb iboende doves og behandles.

Q2. Hvad er forskellen mellem mellemliggende og terminaloperationer?

Stream-operationer kombineres i rørledninger til behandling af streams. Alle operationer er enten mellemliggende eller terminaler.

Mellemliggende operationer er de operationer, der vender tilbage Strøm selv muliggør yderligere operationer på en stream.

Disse operationer er altid dovne, dvs. de behandler ikke strømmen på opkaldsstedet, en mellemoperation kan kun behandle data, når der er en terminaloperation. Nogle af de mellemliggende operationer er filter, kort og flatMap.

Terminaloperationer afslutter rørledningen og indleder strømbehandling. Strømmen føres gennem alle mellemliggende operationer under terminaloperationsopkald. Terminaloperationer inkluderer for hver, reducere, indsamle og sum.

For at køre dette punkt hjem, lad os se på et eksempel med bivirkninger:

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

Outputtet vil være som følger:

Stream uden terminaloperation Stream med terminaloperation fordoblet 1 fordobling 2 fordobling 3

Som du kan se, udløses de mellemliggende operationer kun, når der findes en terminalhandling.

Q3. Hvad er forskellen mellem Kort og flatMap Stream-drift?

Der er en forskel i underskrift mellem kort og flatMap. Generelt set er en kort operation indpakker sin returværdi inden i sin ordinære type, mens flatMap gør ikke.

For eksempel i Valgfri, a kort operation ville vende tilbage Valgfri skriv mens flatMap ville vende tilbage Snor type.

Så efter kortlægning skal man pakke (læs "flad") objektet for at hente værdien, mens der efter flad kortlægning ikke er noget sådant behov, da objektet allerede er fladt. Det samme koncept anvendes til kortlægning og flad kortlægning i Strøm.

Begge kort og flatMap er mellemliggende strømoperationer, der modtager en funktion og anvender denne funktion på alle elementer i en strøm.

Forskellen er, at for kort, returnerer denne funktion en værdi, men for flatMap, returnerer denne funktion en stream. Det flatMap betjening "flader" vandløbene ud i en.

Her er et eksempel, hvor vi tager et kort over brugernes navne og lister over telefoner og "flader" det ned til en liste over telefoner for alle brugere, der bruger flatMap:

Kort folk = nyt 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. Hvad er Stream Pipelining i Java 8?

Stream pipelining er begrebet kædeoperationer sammen. Dette gøres ved at opdele de operationer, der kan ske på en stream i to kategorier: mellemliggende operationer og terminaloperationer.

Hver mellemoperation returnerer en forekomst af Stream selv, når den kører, et vilkårligt antal mellemliggende operationer kan derfor indstilles til at behandle data, der danner en behandlingsrørledning.

Der skal derefter være en terminaloperation, der returnerer en endelig værdi og afslutter rørledningen.

10. Java 8 Date and Time API

Q1. Fortæl os om den nye dato og tid API i Java 8

Et langvarigt problem for Java-udviklere har været den utilstrækkelige understøttelse af de dato- og tidsmanipulationer, der kræves af almindelige udviklere.

De eksisterende klasser såsom java.util.Date og SimpleDateFormatter er ikke trådsikre, hvilket fører til potentielle problemer med samtidig valuta for brugerne.

Dårligt API-design er også en realitet i den gamle Java Data API. Her er bare et hurtigt eksempel - år inde java.util.Date start kl. 1900, måneder starter kl. 1, og dage starter kl. 0, hvilket ikke er særlig intuitivt.

Disse udgaver og flere andre har ført til populariteten af ​​tredjeparts dato- og tidsbiblioteker, såsom Joda-Time.

For at løse disse problemer og give bedre support i JDK er en ny dato og tid API, der er fri for disse problemer, designet til Java SE 8 under pakken java.tid.

11. Konklusion

I denne artikel har vi udforsket et par meget vigtige spørgsmål til tekniske interviewspørgsmål med en bias på Java 8. Dette er på ingen måde en udtømmende liste, men indeholder kun spørgsmål, som vi synes mest sandsynligt vil blive vist i hver nye funktion på Java 8.

Selvom du lige er startet op, er uvidenhed om Java 8 ikke en god måde at gå i et interview på, især når Java vises stærkt i dit CV. Det er derfor vigtigt, at du tager dig tid til at forstå svarene på disse spørgsmål og muligvis undersøge mere.

Held og lykke i dit interview.

Næste » Spørgsmål om hukommelsesstyring i Java Interview (+ svar) « Tidligere spørgsmål om Java-klassestruktur og initialisering

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