Java 8 Interview Questions (+ Answers)

Tento článok je súčasťou série: • Otázky týkajúce sa rozhovorov o zbierkach Java

• Dotazy týkajúce sa systému typu Java

• Otázky týkajúce sa rozhovorov o súbehu Java (+ odpovede)

• Otázky týkajúce sa štruktúry triedy Java a inicializácie

• Otázky k rozhovoru pre Java 8 (+ odpovede) (aktuálny článok) • Správa pamäte v otázkach rozhovoru pre Java (+ odpovede)

• Java Generics Interview otázky (+ odpovede)

• Otázky týkajúce sa riadenia toku Java (+ odpovede)

• Otázky týkajúce sa rozhovorov o výnimkách jazyka Java (+ odpovede)

• Dotazy k anotáciám Java (+ odpovede)

• Najlepšie otázky týkajúce sa jarného rámcového rozhovoru

1. Úvod

V tomto článku sa budeme zaoberať niektorými otázkami súvisiacimi s JDK8, ktoré by sa mohli vyskytnúť počas rozhovoru.

Java 8 je vydanie platformy plné nových jazykových funkcií a tried knižnice. Väčšina z týchto nových funkcií je zameraná na dosiahnutie čistejšieho a kompaktnejšieho kódu a niektoré pridávajú nové funkcie, ktoré v Jave nikdy neboli podporované.

2. Všeobecné znalosti Java 8

Q1. Aké nové funkcie boli pridané v prostredí Java 8?

Java 8 sa dodáva s niekoľkými novými funkciami, ale najvýznamnejšie sú tieto:

  • Lambda výrazy - nová jazyková funkcia umožňujúca považovať akcie za objekty
  • Odkazy na metódu - povoliť definovanie výrazov Lambda odkazom na metódy priamo pomocou ich názvov
  • Voliteľné - špeciálna trieda obalov používaných na vyjadrenie voliteľnosti
  • Funkčné rozhranie - rozhranie s maximálne jednou abstraktnou metódou, implementáciu je možné zabezpečiť pomocou výrazu Lambda
  • Predvolené metódy - okrem abstraktných metód nám dá možnosť pridávať úplné implementácie do rozhraní
  • Nashorn, JavaScript Engine - Java engine na vykonávanie a vyhodnocovanie kódu JavaScript
  • Prúd API - špeciálna trieda iterátorov, ktorá umožňuje funkčné spracovanie zbierok objektov
  • Date API - vylepšené, nemenné, JodaTime inšpirované Date API

Spolu s týmito novými funkciami sa veľa vylepšení funkcií vykonáva pod kapotou, a to na úrovni kompilátora aj JVM.

3. Odkazy na metódy

Q1. Čo je to odkaz na metódu?

Odkaz na metódu je konštrukt Java 8, ktorý je možné použiť na odkazovanie na metódu bez jej vyvolania. Používa sa na ošetrenie metód ako Lambda Expressions. Fungujú iba ako syntaktický cukor na zníženie výrečnosti niektorých lambd. Týmto spôsobom nasledujúci kód:

(o) -> o.toString ();

sa môžu stať:

Object :: toString ();

Odkaz na metódu možno identifikovať dvojitým dvojbodkou, ktorá oddeľuje názov triedy alebo objektu a názov metódy. Má rôzne variácie, napríklad odkaz na konštruktéra:

Reťazec :: nový;

Statická referencia metódy:

String :: valueOf;

Odkaz na metódu viazanej inštancie:

str :: toString;

Odkaz na metódu neviazanej inštancie:

String :: toString;

Podrobný popis odkazov na metódy s úplnými príkladmi si môžete prečítať pomocou tohto a tohto odkazu.

Q2. Čo je význam reťazca String :: Valueof Expression?

Je to statický odkaz na metódu hodnota metóda String trieda.

4. Voliteľné

Q1. Čo je Voliteľné? Ako sa dá použiť?

Voliteľné je nová trieda v prostredí Java 8, ktorá zapuzdruje voliteľnú hodnotu, t. j. hodnotu, ktorá tam je alebo nie je. Je to obal okolo objektu a môžete si ho predstaviť ako zásobník nuly alebo jedného prvku.

Voliteľné má špeciál Optional.empty () hodnotu namiesto zalomeného nulový. Môže sa teda použiť namiesto nulovanej hodnoty, ktorej sa treba zbaviť NullPointerException v mnohých prípadoch.

Môžete si prečítať samostatný článok o Voliteľné tu.

Hlavným účelom Voliteľné, ako to navrhli jeho tvorcovia, mal byť návratovým typom metód, ktoré by sa predtým vracali nulový. Takéto metódy by vyžadovali, aby ste napísali štandardný kód na kontrolu návratovej hodnoty, a niekedy by mohli zabudnúť na defenzívnu kontrolu. V prostredí Java 8, an Voliteľné návratový typ výslovne vyžaduje, aby ste s nulovými alebo nenulovými hodnotami zaobchádzali odlišne.

Napríklad Stream.min () metóda počíta minimálnu hodnotu v prúde hodnôt. Čo však v prípade, že je prúd prázdny? Keby to nebolo za Voliteľné, metóda by sa vrátila nulový alebo vyhodit vynimku.

Ale vracia Voliteľné hodnota, ktorá môže byť Optional.empty () (druhý prípad). To nám umožňuje ľahko vyriešiť takýto prípad:

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

Stojí za zmienku, že Voliteľné nie je trieda na všeobecné účely ako Možnosť v Scale. Neodporúča sa používať ako hodnotu poľa v triedach entít, čo je jasne naznačené tým, že neimplementuje Serializovateľné rozhranie.

5. Funkčné rozhrania

Q1. Popíšte niektoré funkčné rozhrania v štandardnej knižnici.

V systéme Windows XP je veľa funkčných rozhraní java.util.funkcia balíček, medzi tie najbežnejšie patria okrem iného:

  • Funkcia - trvá jeden argument a vráti výsledok
  • Spotrebiteľ - trvá jeden argument a nevráti žiadny výsledok (predstavuje vedľajší účinok)
  • Dodávateľ - nezaberá argument a vráti výsledok
  • Predikát - trvá jeden argument a vráti logickú hodnotu
  • BiFunkcia - trvá dva argumenty a vráti výsledok
  • BinaryOperator - je to podobné ako a BiFunkcia, pričom dva argumenty a vráti výsledok. Dva argumenty a výsledok sú všetky rovnaké typy
  • UnaryOperator - je to podobné ako a Funkcia, pričom vezmeme jediný argument a vrátime výsledok rovnakého typu

Viac informácií o funkčných rozhraniach nájdete v článku „Funkčné rozhrania v prostredí Java 8“.

Q2. Čo je funkčné rozhranie? Aké sú pravidlá definovania funkčného rozhrania?

Funkčné rozhranie je rozhranie, ktoré neobsahuje nič viac, ale menej ako jednu jedinú abstraktnú metódu (predvolené metódy sa nepočítajú).

Tam, kde je vyžadovaná inštancia takého rozhrania, je možné namiesto toho použiť výraz Lambda. Formálnejšie povedané: Funkčné rozhrania poskytujú cieľové typy pre výrazy lambda a odkazy na metódy.

Argumenty a návratový typ takéhoto výrazu sa priamo zhodujú s argumentmi jedinej abstraktnej metódy.

Napríklad Spustiteľné interface je funkčné rozhranie, takže namiesto:

Thread thread = new Thread (new Runnable () {public void run () {System.out.println ("Hello World!");}});

môžete jednoducho urobiť:

Thread thread = new Thread (() -> System.out.println ("Hello World!"));

Funkčné rozhrania sú zvyčajne označené poznámkou @Funkčné rozhranie anotácia - ktorá je informatívna a nemá vplyv na sémantiku.

6. Predvolená metóda

Q1. Čo je predvolená metóda a kedy ju použijeme?

Predvolená metóda je metóda s implementáciou, ktorú je možné nájsť v rozhraní.

Môžeme použiť predvolenú metódu na pridanie novej funkcie do rozhrania pri zachovaní spätnej kompatibility s triedami, ktoré už rozhranie implementujú:

verejné rozhranie Vozidlo {public void move (); default void hoot () {System.out.println ("peep!"); }}

Zvyčajne, keď sa do rozhrania pridá nová abstraktná metóda, všetky implementačné triedy sa rozbijú, kým novú abstraktnú metódu neimplementujú. V prostredí Java 8 sa tento problém vyriešil použitím predvolenej metódy.

Napríklad, Zbierka rozhranie nemá pre každý deklarácia metódy. Pridanie takejto metódy by teda jednoducho zlomilo celé kolekcie API.

Java 8 zavádza predvolenú metódu Zbierka rozhranie môže mať predvolenú implementáciu pre každý bez toho, aby triedy implementujúce toto rozhranie implementovali to isté.

Q2. Bude sa kompilovať nasledujúci kód?

@FunctionalInterface verejné rozhranie Function2 {public V apply (T t, U u); predvolený počet neplatných () {// increment counter}}

Áno. Tento kód sa skompiluje, pretože dodržiava špecifikáciu funkčného rozhrania a definuje iba jednu abstraktnú metódu. Druhá metóda, počítať, je predvolená metóda, ktorá nezvyšuje počet abstraktných metód.

7. Výrazy lambda

Q1. Čo je lambda výraz a na čo sa používa

Jednoducho povedané, výraz lambda je funkcia, na ktorú je možné odkazovať a obchádzať ju ako objekt.

Výrazy lambda zavádzajú funkčné spracovanie štýlov v Jave a uľahčujú písanie kompaktného a ľahko čitateľného kódu.

Z tohto dôvodu sú výrazy lambda prirodzenou náhradou za anonymné triedy ako argumenty metód. Jedným z ich hlavných použití je definovanie riadkových implementácií funkčných rozhraní.

Q2. Vysvetlite syntax a charakteristiky výrazu lambda

Výraz lambda sa skladá z dvoch častí: časti parametra a časti výrazov oddelených šípkou dopredu, ako je uvedené nižšie:

parametre -> výrazy

Akýkoľvek výraz lambda má nasledujúce vlastnosti:

  • Nepovinné vyhlásenie o type - pri deklarovaní parametrov na ľavej strane lambda nemusíme deklarovať ich typy, pretože ich kompilátor dokáže odvodiť z ich hodnôt. Takže int param ->… a param ->… všetky sú platné
  • Nepovinné zátvorky - keď je deklarovaný iba jeden parameter, nemusíme ho uvádzať v zátvorkách. To znamená param ->… a (param) ->… všetky sú platné. Ak je ale deklarovaných viac ako jeden parameter, sú uvedené zátvorky
  • Voliteľné zložené traky - keď má výrazová časť iba jediný výrok, nie sú potrebné zložené zátvorky. To znamená, že param -> vyhlásenie a param -> {vyhlásenie;} všetky sú platné. Kučeravé zátvorky sú ale povinné, ak existuje viac než jedno vyhlásenie
  • Nepovinné vyhlásenie o vrátení - keď výraz vráti hodnotu a je zabalený do zložených zátvoriek, potom návratový príkaz nepotrebujeme. To znamená (a, b) -> {return a + b;} a (a, b) -> {a + b;} sú obidve platné

Ak sa chcete dozvedieť viac informácií o výrazoch lambda, kliknite na tento a tento odkaz.

8. Nashorn Javascript

Q1. Čo je Nashorn v Java8?

Nashorn je nový procesor na spracovanie Javascriptov pre platformu Java, ktorý sa dodáva s jazykom Java 8. Až do JDK 7 používala platforma Java program Mozilla Rhino na rovnaké účely. ako nástroj na spracovanie Javascriptov.

Nashorn poskytuje lepšiu zhodu s normalizovanou špecifikáciou JavaScriptu ECMA a lepší výkon za behu ako jeho predchodca.

Q2. Čo je JJS?

V prostredí Java 8 jjs je nový spustiteľný nástroj alebo nástroj príkazového riadku používaný na vykonávanie kódu Javascript na konzole.

9. Prúdy

Q1. Čo je to stream? Ako sa líši od zbierky?

Zjednodušene povedané, prúd je iterátor, ktorého úlohou je prijať súbor akcií, ktoré sa majú aplikovať na každý z prvkov, ktoré obsahuje.

Prúd predstavuje postupnosť objektov zo zdroja, napríklad zo zbierky, ktorá podporuje agregované operácie. Boli navrhnuté tak, aby bolo spracovanie zbierok jednoduché a výstižné. Na rozdiel od kolekcií je logika iterácie implementovaná vo vnútri streamu, takže môžeme používať metódy ako mapa a flatMap za vykonanie deklaratívneho spracovania.

Ďalším rozdielom je, že Prúd API je plynulé a umožňuje pipeline:

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

A ešte ďalším dôležitým rozdielom od zbierok je, že streamy sú zo svojej podstaty lenivo načítané a spracované.

Q2. Aký je rozdiel medzi prechodnými a koncovými operáciami?

Prevádzky prúdov sa kombinujú do potrubí na spracovanie prúdov. Všetky operácie sú buď prechodné alebo koncové.

Sprostredkujúce operácie sú operácie, ktoré sa vracajú Prúd sám umožňuje ďalšie operácie s prúdom.

Tieto operácie sú vždy lenivé, to znamená, že nespracúvajú prúd na mieste hovoru, sprostredkujúca operácia môže spracovávať údaje iba vtedy, keď existuje operácia terminálu. Niektoré z prechodných operácií sú filter, mapa a flatMap.

Terminálové operácie ukončujú plynovod a inicializujú spracovanie toku. Prúd prechádza cez všetky prechodné operácie počas hovoru operácie terminálu. Medzi terminálne operácie patrí pre každý, znížiť, zbierať a súčet.

Aby sme tento bod priviedli domov, pozrime sa na príklad s vedľajšími účinkami:

public static void main (String [] args) {System.out.println ("Stream bez operácie terminálu"); Arrays.stream (new int [] {1, 2, 3}). Map (i -> {System.out.println ("doubling" + i); return i * 2;}); System.out.println ("Stream s prevádzkou terminálu"); Arrays.stream (new int [] {1, 2, 3}). Map (i -> {System.out.println ("doubling" + i); return i * 2;}). Sum (); }

Výstup bude nasledovný:

Stream bez prevádzky terminálu Stream s prevádzkou terminálu zdvojnásobenie 1 zdvojnásobenie 2 zdvojnásobenie 3

Ako vidíte, prechodné operácie sa spustia iba vtedy, keď existuje operácia terminálu.

Q3. Aký je rozdiel medzi Mapa a flatMap Prevádzka streamu?

Medzi podpismi je rozdiel mapa a flatMap. Všeobecne povedané, a mapa operácia zabalí svoju návratovú hodnotu do svojho ordinálneho typu, zatiaľ čo flatMap nie.

Napríklad v Voliteľné, a mapa operácia by sa vrátila Voliteľné napíš zatiaľ flatMap by sa vrátil String typu.

Takže po mapovaní je potrebné rozbaliť (prečítať „vyrovnať“) objekt, aby sa získala hodnota, zatiaľ čo po plochom mapovaní už nie je taká potreba, pretože objekt je už sploštený. Rovnaký koncept sa uplatňuje na mapovanie a plošné mapovanie v systéme Windows Prúd.

Oboje mapa a flatMap sú operácie medziprúdového toku, ktoré dostanú funkciu a použijú túto funkciu na všetky prvky toku.

Rozdiel je v tom, že pre mapa, táto funkcia vráti hodnotu, ale pre flatMap, táto funkcia vráti stream. The flatMap operácia „splošťuje“ prúdy do jedného.

Tu je príklad, keď vezmeme mapu mien používateľov a zoznamy telefónov a „sploštíme ich“ na zoznam telefónov všetkých používateľov, ktorí používajú flatMap:

Mapa people = new 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")); Zoznam telefónov = people.values ​​(). Stream () .flatMap (Collection :: stream) .collect (Collectors.toList ());

Q4. Čo je Stream Pipelining v Jave 8?

Stream pipelining je koncept vzájomného reťazenia. To sa deje rozdelením operácií, ktoré sa môžu stať v prúde, do dvoch kategórií: stredné operácie a terminálne operácie.

Každá sprostredkujúca operácia pri spustení vráti inštanciu Stream, takže je možné nastaviť ľubovoľný počet sprostredkujúcich operácií na spracovanie údajov tvoriacich spracovateľský kanál.

Potom musí existovať operácia terminálu, ktorá vráti konečnú hodnotu a ukončí plynovod.

10. Java 8 Date and Time API

Q1. Povedzte nám o novom API dátumu a času v prostredí Java 8

Dlhodobým problémom vývojárov Java bola nedostatočná podpora manipulácií s dátumom a časom vyžadovaných bežnými vývojármi.

Existujúce triedy ako napr java.util.Date a SimpleDateFormatter nie sú bezpečné pre vlákna, čo vedie k potenciálnym problémom so súbežnosťou pre používateľov.

Zlý dizajn API je realitou aj v starom Java Data API. Tu je len rýchly príklad - roky v java.util.Date začiatok od roku 1900, mesiace od 1 a dni od 0, čo nie je príliš intuitívne.

Tieto problémy a niekoľko ďalších viedli k popularite knižníc dátumu a času tretích strán, napríklad Joda-Time.

S cieľom vyriešiť tieto problémy a poskytnúť lepšiu podporu v JDK bolo pre balík Java SE 8 v balíku navrhnuté nové rozhranie API pre dátum a čas, ktoré tieto problémy neobsahuje. java.time.

11. Záver

V tomto článku sme preskúmali niekoľko veľmi dôležitých otázok týkajúcich sa otázok technického pohovoru so zaujatosťou v prostredí Java 8. Toto nie je v žiadnom prípade vyčerpávajúci zoznam, ale obsahuje iba otázky, o ktorých si myslíme, že sa s najväčšou pravdepodobnosťou objavia v každej novej funkcii Java. 8.

Aj keď ešte len začínate, nevedomosť o Java 8 nie je dobrý spôsob, ako ísť na pohovor, zvlášť keď sa vo vašom životopise výrazne objaví Java. Je preto dôležité, aby ste si našli čas na pochopenie odpovedí na tieto otázky a prípadne vykonali ďalší výskum.

Veľa šťastia v rozhovore.

Ďalšie » Správa pamäte v prostredí Java Interview Otázky (+ odpovede) « Predchádzajúce otázky týkajúce sa štruktúry a inicializácie triedy Java

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