Pitanja za intervju za Java 8 (+ odgovori)

Ovaj je članak dio serije: • Pitanja za intervju za Java Collections

• Pitanja o intervjuu za sustav tipa Java

• Pitanja za intervju s Java-om (+ odgovori)

• Struktura Java razreda i pitanja za intervju za inicijalizaciju

• Pitanja o intervjuu za Java 8 (+ odgovori) (trenutni članak) • Upravljanje memorijom u pitanjima o intervjuu za Java (+ odgovori)

• Pitanja o intervjuu za Java Generics (+ odgovori)

• Pitanja za intervju s Java Flow Control (+ odgovori)

• Pitanja o intervjuu za iznimke Java (+ odgovori)

• Pitanja za intervju s Java Annotations (+ odgovori)

• Najpopularnija pitanja za proljetni okvirni intervju

1. Uvod

U ovom ćemo članku istražiti neka pitanja u vezi s JDK8 koja bi se mogla pojaviti tijekom intervjua.

Java 8 izdanje je platforme prepuno novih jezičnih značajki i klasa knjižnica. Većina ovih novih značajki usmjerena je ka postizanju čišćeg i kompaktnijeg koda, a neke dodaju novu funkcionalnost koja nikada nije podržana u Javi.

2. Java 8 Opće znanje

Q1. Koje su nove značajke dodane u Javi 8?

Java 8 isporučuje se s nekoliko novih značajki, ali najvažnije su sljedeće:

  • Lambda izrazi - nova jezična značajka koja omogućava postupanje prema objektima
  • Reference o metodama - omogućiti definiranje Lambda izraza pozivanjem na metode izravno koristeći njihova imena
  • Neobvezno - posebna klasa omota koja se koristi za izražavanje neobaveznosti
  • Funkcionalno sučelje - sučelje s maksimalno jednom apstraktnom metodom, implementacija se može pružiti pomoću Lambda izraza
  • Zadane metode - daju nam mogućnost dodavanja cjelovitih implementacija u sučelja osim apstraktnih metoda
  • Nashorn, JavaScript motor - Mehanizam zasnovan na Javi za izvršavanje i procjenu JavaScript koda
  • Stream API - posebna klasa iteratora koja omogućuje obradu zbirki objekata na funkcionalan način
  • API datuma - poboljšani, nepromjenjivi API za datum nadahnut JodaTimeom

Zajedno s tim novim značajkama, mnoštvo poboljšanja značajki vrši se ispod haube, na razini kompajlera i JVM-a.

3. Reference o metodama

Q1. Što je referenca metode?

Referenca metode je konstrukcija Java 8 koja se može koristiti za referenciranje metode bez pozivanja na nju. Koristi se za liječenje metoda kao Lambda izraza. Oni djeluju samo kao sintaktički šećer kako bi smanjili glagolost nekih lambda. Na ovaj način slijedeći kod:

(o) -> o.toString ();

može postati:

Objekt :: toString ();

Referenca metode može se identificirati dvostrukim dvotočkom koja razdvaja ime klase ili objekta i naziv metode. Ima različite varijacije, poput reference konstruktora:

String :: novo;

Referenca statičke metode:

String :: valueOf;

Referenca metode vezane instance:

str :: toString;

Referenca metode nevezane instance:

String :: toString;

Detaljan opis referenci metoda s cjelovitim primjerima možete pročitati slijedeći ovu i ovu vezu.

Q2. Što je značenje niza :: Vrijednost izraza?

To je statična referenca metode na vrijednost metoda Niz razred.

4. Neobvezno

Q1. Što je Neobvezno? Kako se može koristiti?

Neobvezno je nova klasa u Javi 8 koja obuhvaća neobaveznu vrijednost, tj. vrijednost koja postoji ili nije. To je omot oko predmeta i o njemu možete razmišljati kao o spremniku s nulom ili jednim elementom.

Neobvezno ima poseban Neobvezno.prazno () vrijednost umjesto zamotana null. Stoga se može koristiti umjesto null vrijednosti koja se može riješiti NullPointerException u puno slučajeva.

Možete pročitati posvećeni članak o Neobvezno ovdje.

Glavna svrha Neobvezno, kako su ga dizajnirali njegovi tvorci, trebala je biti metoda povratka koja bi se prethodno vratila null. Takve bi metode zahtijevale da napišete šifru uzorka kako biste provjerili povratnu vrijednost, a ponekad bi mogle zaboraviti obaviti obrambenu provjeru. U Javi 8, an Neobvezno tip return izričito zahtijeva da drugačije obrađujete null ili non-null zamotane vrijednosti.

Na primjer, Stream.min () metoda izračunava minimalnu vrijednost u toku vrijednosti. Ali što ako je tok prazan? Da nije bilo Neobvezno, metoda bi se vratila null ili izbaciti iznimku.

Ali vraća Neobvezno vrijednost koja može biti Neobvezno.prazno () (drugi slučaj). To nam omogućuje lako rješavanje takvih slučajeva:

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

Vrijedno je to napomenuti Neobvezno nije klasa opće namjene poput Opcija u Skali. Ne preporučuje se korištenje kao vrijednosti polja u klasama entiteta, što je jasno naznačeno time što se ne implementira Serijalizirati sučelje.

5. Funkcionalna sučelja

Q1. Opišite neka od funkcionalnih sučelja u standardnoj knjižnici.

U sustavu Windows ima puno funkcionalnih sučelja java.util.funkcija paket, oni uobičajeniji uključuju, ali nisu ograničeni na:

  • Funkcija - potreban je jedan argument i vraća rezultat
  • Potrošač - uzima jedan argument i ne vraća rezultat (predstavlja nuspojavu)
  • Dobavljač - nije potreban argument i vraća rezultat
  • Predikat - potreban je jedan argument i vraća logičku vrijednost
  • BiFunction - potrebna su dva argumenta i vraća rezultat
  • BinaryOperator - slično je a BiFunction, uzimajući dva argumenta i vraćajući rezultat. Dva su argumenta i rezultat iste vrste
  • UnaryOperator - slično je a Funkcija, uzimajući jedan argument i vraćajući rezultat iste vrste

Za više informacija o funkcionalnim sučeljima pogledajte članak "Funkcionalna sučelja u Javi 8".

Q2. Što je funkcionalno sučelje? Koja su pravila definiranja funkcionalnog sučelja?

Funkcionalno sučelje je sučelje s ni više ni manje nego jednom jedinom apstraktnom metodom (zadano metode se ne računaju).

Tamo gdje je potreban primjer takvog sučelja, umjesto njega se može koristiti Lambda izraz. Formalnije rečeno: Funkcionalna sučelja pružiti ciljne vrste za lambda izraze i reference metoda.

Argumenti i vrsta povratka takvog izraza izravno se podudaraju s argumentima pojedinačne apstraktne metode.

Na primjer, Izvodljivo sučelje je funkcionalno sučelje, pa umjesto:

Nit niti = nova nit (nova Izvodljiva () {public void run () {System.out.println ("Hello World!";}});

možete jednostavno učiniti:

Nit niti = nova nit (() -> System.out.println ("Pozdrav svijetu!"));

Funkcionalna sučelja obično su označena znakom @FunctionalInterface napomena - koja je informativna i ne utječe na semantiku.

6. Zadana metoda

Q1. Što je zadana metoda i kada je koristimo?

Zadana metoda je metoda s implementacijom - koja se može naći u sučelju.

Možemo upotrijebiti zadanu metodu za dodavanje nove funkcionalnosti sučelju, zadržavajući povratnu kompatibilnost s klasama koje već implementiraju sučelje:

javno sučelje Vozilo {public void move (); zadana void hoot () {System.out.println ("peep!"); }}

Obično, kada se u sučelje doda nova apstraktna metoda, sve će se klase implementacije prekidati dok ne implementiraju novu apstraktnu metodu. U Javi 8 ovaj je problem riješen korištenjem zadane metode.

Na primjer, Kolekcija sučelje nema za svakoga deklaracija metode. Stoga bi dodavanje takve metode jednostavno razbilo cijeli API zbirki.

Java 8 uvodi zadanu metodu tako da Kolekcija sučelje može imati zadanu implementaciju za svakoga metodu bez potrebe da klase koje implementiraju ovo sučelje implementiraju isto.

Q2. Hoće li se sastaviti sljedeći kod?

@FunctionalInterface javno sučelje Funkcija2 {primjenjuje se javni V (T t, U u); zadani broj praznina () {// brojač prirasta}}

Da. Kôd će se kompajlirati jer slijedi specifikaciju funkcionalnog sučelja koja definira samo jednu apstraktnu metodu. Druga metoda, računati, zadana je metoda koja ne povećava broj apstraktnih metoda.

7. Lambda izrazi

Q1. Što je Lambda izraz i za što se koristi

U vrlo jednostavnim uvjetima, lambda izraz je funkcija na koju se može referencirati i prosljeđivati ​​kao objekt.

Lambda izrazi uvode funkcionalnu obradu stila u Javi i olakšavaju pisanje kompaktnog i lako čitljivog koda.

Zbog toga su lambda izrazi prirodna zamjena za anonimne klase kao argumente metode. Jedna od njihovih glavnih primjena je definiranje inline implementacija funkcionalnih sučelja.

Q2. Objasnite sintaksu i karakteristike Lambda izraza

Lambda izraz sastoji se od dva dijela: dijela parametra i dijela izraza odvojenih strelicom prema naprijed kao dolje:

params -> izrazi

Bilo koji lambda izraz ima sljedeće značajke:

  • Neobvezna deklaracija tipa - prilikom deklariranja parametara s lijeve strane lambda-e, ne trebamo deklarirati njihove tipove jer ih kompajler može zaključiti iz njihovih vrijednosti. Tako int param -> ... i param ->… svi su valjani
  • Izborne zagrade - kada je deklariran samo jedan parametar, ne trebamo ga stavljati u zagrade. To znači param ->… i (param) -> ... svi su valjani. Ali kada se prijavi više od jednog parametra, potrebne su zagrade
  • Po želji kovrčave zagrade - kada dio izraza ima samo jednu izjavu, nema potrebe za kovrčavim zagradama. Ovo znači to param -> izjava i param -> {izjava;} svi su valjani. No kovrčave zagrade potrebne su kada postoji više od jedne izjave
  • Izborna izjava o povratu - kada izraz vraća vrijednost i ona je umotana u kovrčave zagrade, tada nam ne treba izraz return. To znaci (a, b) -> {povratak a + b;} i (a, b) -> {a + b;} vrijede oba

Da biste pročitali više o Lambda izrazima, slijedite ovaj link i ovaj.

8. Nashorn Javascript

Q1. Što je Nashorn u Javi8?

Nashorn je novi mehanizam za obradu Javascripta za Java platformu koji se isporučuje s Javom 8. Do JDK 7, Java platforma koristila je Mozilla Rhino u istu svrhu. kao mehanizam za obradu Javascripta.

Nashorn pruža bolju usklađenost s ECMA-om normaliziranom JavaScript specifikacijom i bolje performanse izvođenja od svog prethodnika.

Q2. Što je JJS?

U Javi 8, jjs je novi izvršni alat ili alat naredbenog retka koji se koristi za izvršavanje Javascript koda na konzoli.

9. Potoci

Q1. Što je tok? Po čemu se razlikuje od kolekcije?

Jednostavno rečeno, tok je iterator čija je uloga prihvatiti skup radnji koje će se primijeniti na svaki od elemenata koji sadrži.

Potok predstavlja slijed objekata iz izvora kao što je zbirka, koja podržava agregatne operacije. Dizajnirani su kako bi obrada zbirki bila jednostavna i sažeta. Suprotno zbirkama, logika iteracije implementirana je unutar toka, tako da možemo koristiti metode poput karta i flatMap za obavljanje deklarativne obrade.

Druga je razlika što Stream API tečno govori i omogućuje cjevovod:

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

A još jedna važna razlika od kolekcija je ta što se potoci u biti lijeno učitavaju i obrađuju.

Q2. Koja je razlika između posrednih i terminalnih operacija?

Operacije strujanja kombiniraju se u cjevovode za obradu tokova. Sve operacije su ili srednje ili terminalne.

Posredničke operacije su one operacije koje se vraćaju Stream sam omogućava daljnje operacije na toku.

Te su operacije uvijek lijene, tj. Ne obrađuju tok na mjestu poziva, posredna operacija može obrađivati ​​podatke samo kada postoji terminalna operacija. Neke od posrednih operacija su filtar, karta i flatMap.

Terminalne operacije završavaju cjevovod i započinju obradu toka. Tok se prebacuje kroz sve posredničke operacije tijekom poziva operacije terminala. Terminalne operacije uključuju za svakoga, smanjiti, sakupljati i iznos.

Da bismo ovu točku doveli kući, pogledajmo primjer sa nuspojavama:

javna statička void glavna (String [] args) {System.out.println ("Stream bez rada terminala"); Arrays.stream (novi int [] {1, 2, 3}). Map (i -> {System.out.println ("udvostručavanje" + i); return i * 2;}); System.out.println ("Stream s radom terminala"); Arrays.stream (novi int [] {1, 2, 3}). Map (i -> {System.out.println ("udvostručavanje" + i); return i * 2;}). Sum (); }

Izlaz će biti sljedeći:

Strujanje bez rada terminala Strujanje s radom terminala udvostručenje 1 udvostručenje 2 udvostručavanje 3

Kao što vidite, posredne operacije pokreću se samo kada postoji operacija terminala.

Q3. Koja je razlika između Karta i flatMap Prijenosni rad?

Postoji razlika u potpisu između karta i flatMap. Općenito govoreći, a karta operacija omotava svoju povratnu vrijednost unutar svog rednog tipa while flatMap ne.

Na primjer, u Neobvezno, a karta operacija bi se vratila Neobvezno upišite dok flatMap bi se vratio Niz tip.

Dakle, nakon mapiranja treba odmotati (pročitati "poravnati") objekt da bi dohvatio vrijednost, dok nakon ravnog mapiranja nema takve potrebe jer je objekt već spljošten. Isti koncept primjenjuje se na mapiranje i ravno mapiranje u Stream.

Oba karta i flatMap su posredne operacije prijenosa koje primaju funkciju i primjenjuju ovu funkciju na sve elemente prijenosa.

Razlika je u tome što je za karta, ova funkcija vraća vrijednost, ali za flatMap, ova funkcija vraća tok. The flatMap operacija "izravnava" potoke u jedno.

Evo primjera gdje uzimamo mapu korisničkih imena i popisa telefona i "izravnavamo" je na popis telefona svih korisnika koji koriste flatMap:

Karta ljudi = nova 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")); Popis telefona = people.values ​​(). Stream () .flatMap (Collection :: stream) .collect (Collectors.toList ());

Q4. Što je strujanje u Java 8?

Cjevovodno strujanje koncept je zajedničkog povezivanja operacija. To se postiže dijeljenjem operacija koje se mogu dogoditi u toku u dvije kategorije: posredne operacije i terminalne operacije.

Svaka intermedijarna operacija vraća instancu samog Stream-a kad se izvodi, stoga se može postaviti proizvoljan broj posrednih operacija za obradu podataka koji čine cjevovod za obradu.

Tada mora postojati operacija terminala koja vraća konačnu vrijednost i završava cjevovod.

10. Java 8 Datum i vrijeme API

Q1. Recite nam o novom API-ju za datum i vrijeme u Javi 8

Dugogodišnji problem programera Jave bila je neadekvatna podrška za manipulacije datumom i vremenom koje zahtijevaju obični programeri.

Postojeće klase kao što su java.util.Datum i SimpleDateFormatter nisu zaštićeni nitima, što dovodi do potencijalnih problema s istodobnošću za korisnike.

Loš API dizajn također je stvarnost u starom Java Data API-ju. Evo samo kratkog primjera - godine u java.util.Datum početak u 1900, mjeseci počinju u 1, a dani počinju u 0, što nije baš intuitivno.

Ova izdanja i nekoliko drugih doveli su do popularnosti neovisnih knjižnica datuma i vremena, poput Joda-Time.

Kako bi se riješili ovi problemi i pružila bolja podrška u JDK, novi Java API za datum i vrijeme, bez ovih problema, dizajniran je za Javu SE 8 u paketu java.vrijeme.

11. Zaključak

U ovom smo članku istražili nekoliko vrlo važnih pitanja za pitanja tehničkog intervjua s predrasudama na Javi 8. Ovo nikako nije iscrpan popis, već sadrži samo pitanja za koja mislimo da će se pojaviti u svakoj novoj značajci Jave 8.

Čak i ako tek započinjete, nepoznavanje Jave 8 nije dobar način za razgovor u intervjuu, pogotovo kada se Java jako pojavljuje u vašem životopisu. Stoga je važno da odvojite malo vremena da biste razumjeli odgovore na ova pitanja i možda istražite više.

Sretno u intervjuu.

Sljedeći » Pitanja o upravljanju memorijom u Javi (+ odgovori) « Prethodna pitanja o strukturi Java klase i inicijalizaciji