Java 8 interjúkérdések (+ válaszok)

Ez a cikk egy sorozat része: • Java Collections interjúkérdések

• Java típusú rendszerinterjúkérdések

• Java egyidejű interjúkérdések (+ válaszok)

• Java osztály felépítése és inicializálása interjúkérdések

• Java 8 interjúkérdések (+ válaszok) (aktuális cikk) • Memóriakezelés a Java interjúkérdésekben (+ válaszok)

• Java Generics interjúkérdések (+ válaszok)

• Java Flow Control interjúkérdések (+ válaszok)

• Java kivételek interjúkérdések (+ válaszok)

• Java Annotations Interjúkérdések (+ Válaszok)

• A tavaszi keretrendszer legfontosabb interjúi

1. Bemutatkozás

Ebben a cikkben megvizsgáljuk a JDK8-mal kapcsolatos kérdéseket, amelyek felmerülhetnek egy interjú során.

A Java 8 egy platformkiadás, amely tele van új nyelvi funkciókkal és könyvtári osztályokkal. Ezen új funkciók többsége a tisztább és kompaktabb kód elérésére irányul, és néhány olyan új funkcióval bővül, amelyet a Java soha nem támogatott.

2. Java 8 általános ismeretek

Q1. Milyen új szolgáltatásokat adtak hozzá a Java 8-hoz?

A Java 8 számos új funkcióval rendelkezik, de a legfontosabbak a következők:

  • Lambda kifejezések - egy új nyelvi funkció, amely lehetővé teszi a műveletek objektumként való kezelését
  • Módszer hivatkozások - lehetővé teszi a Lambda kifejezések definiálását olyan módszerekre hivatkozva, amelyek közvetlenül a nevüket használják
  • Választható - speciális burkolati osztály az opcionális jelleg kifejezésére
  • Funkcionális interfész - interfész maximum egy absztrakt módszerrel, megvalósítás biztosítható a Lambda Expression segítségével
  • Alapértelmezett módszerek - lehetővé teszi számunkra, hogy az absztrakt módszerek mellett teljes megvalósítást adjunk az interfészekhez
  • Nashorn, JavaScript motor - Java-alapú motor a JavaScript-kód futtatásához és kiértékeléséhez
  • Folyam API - egy speciális iterátor osztály, amely lehetővé teszi az objektumok gyűjteményeinek funkcionális feldolgozását
  • Dátum API - továbbfejlesztett, megváltoztathatatlan JodaTime által inspirált Date API

Ezekkel az új funkciókkal együtt rengeteg funkciót fejlesztünk a motorháztető alatt, mind fordító, mind JVM szinten.

3. Módszer hivatkozások

Q1. Mi a módszer referencia?

A metódus referencia egy Java 8 konstrukció, amely felhasználható a metódus hivatkozására anélkül, hogy meghívná. Lambda expresszióként kezelik a módszereket. Csak szintaktikus cukorként működnek, hogy csökkentse egyes lambdák bőbeszédét. Így a következő kódot kell megadnia:

(o) -> o.toString ();

válhat:

Object :: toString ();

A módszer referenciája kettős kettőspont segítségével azonosítható, amely elválasztja az osztály vagy objektum nevét és a módszer nevét. Különböző változatai vannak, például a konstruktor referenciája:

Karakterlánc :: új;

Statikus módszer hivatkozás:

Karakterlánc :: valueOf;

Kötött példány módszer referencia:

str :: toString;

Kötelezettség nélküli példány-módszer hivatkozás:

Karakterlánc :: toString;

A metódus-referenciák részletes leírását, teljes példákkal elolvashatja ezt és ezt a linket követve.

Q2. Mit jelent a karakterlánc: a kifejezés értéke?

Ez egy statikus módszer hivatkozás a értéke módszere Húr osztály.

4. Választható

Q1. Mi a Választható? Hogyan lehet használni?

Választható egy új osztály a Java 8-ban, amely opcionális értéket foglal magában, azaz olyan értéket, amely vagy van, vagy nincs. Ez egy burkoló egy objektum körül, és úgy gondolhat rá, mint nulla vagy egy elemet tartalmazó tárolóra.

Választható van egy különlegessége Opcionális. Üres () érték becsomagolás helyett nulla. Így nullázhatatlan érték helyett felhasználható a megszabadulásra NullPointerException sok esetben.

Erről külön cikket olvashat Választható itt.

A fő célja Választható, amelyet az alkotók terveztek, visszatérő típusú módszereknek kellett lenniük, amelyek korábban visszatérnek nulla. Az ilyen módszerek megkövetelik, hogy írjon kazán kódot a visszatérési érték ellenőrzéséhez, és néha elfelejtheti a védekező ellenőrzést. A Java 8-ban egy Választható A return típus kifejezetten megköveteli, hogy a null vagy non null becsomagolt értékeket másképp kezelje.

Például a Stream.min () módszer kiszámítja a minimális értéket egy értékáramban. De mi van, ha a patak üres? Ha nem lenne Választható, a módszer visszatérne nulla vagy dobjon kivételt.

De visszaad egy Választható ami lehet Opcionális. Üres () (a második eset). Ez lehetővé teszi számunkra, hogy könnyen kezeljük az ilyen eseteket:

int min1 = tömbök.stream (új int [] {1, 2, 3, 4, 5}) .min () .vagyElse (0); assertEquals (1, min1); int min2 = tömbök.stream (új int [] {}) .min () .orElse (0); assertEquals (0, min2); 

Érdemes ezt megjegyezni Választható nem általános célú osztály, mint választási lehetőség Scalában. Nem ajánlott mezőértékként használni az entitásosztályokban, ezt egyértelműen jelzi, hogy nem hajtja végre a Sorosítható felület.

5. Funkcionális interfészek

Q1. Ismertesse a funkcionális interfészek némelyikét a Standard könyvtárban.

Nagyon sok funkcionális interfész van a java.util.function csomagot, a leggyakoribbak a következőket tartalmazzák, de nem kizárólag:

  • Funkció - egy argumentumra van szükség, és eredményt ad vissza
  • Fogyasztó - egy argumentumra van szükség, és nem ad eredményt (mellékhatást jelent)
  • Támogató - nem érvel, és eredményt ad vissza
  • Állítmány - egy argumentumra van szükség, és logikai értéket ad vissza
  • BiFunction - két argumentumra van szükség, és eredményt ad vissza
  • BinaryOperator - hasonló a BiFunction, két érvet vesz fel, és eredményt ad vissza. A két érv és az eredmény ugyanolyan típusú
  • UnaryOperator - hasonló a Funkció, egyetlen argumentumot vesz fel, és azonos típusú eredményt ad vissza

A funkcionális interfészekről a „Funkcionális interfészek a Java 8-ban” című cikkben olvashat.

Q2. Mi a funkcionális interfész? Milyen szabályok vonatkoznak a funkcionális interfész meghatározására?

A funkcionális felület olyan interfész, amely nem több, nem kevesebb, de egyetlen elvont módszert (alapértelmezett módszerek nem számítanak).

Ahol ilyen interfészre van szükség, helyette Lambda kifejezést lehet használni. Formálisabban fogalmazva: Funkcionális interfészek adjon meg céltípusokat a lambda kifejezésekhez és a módszer referenciákhoz.

Az ilyen kifejezések argumentumai és visszatérési típusai közvetlenül egyeznek az egyetlen absztrakt módszerével.

Például a Futható az interfész egy funkcionális interfész, tehát a következők helyett:

Téma szál = új Téma (új Runnable () {public void run () {System.out.println ("Helló világ!");}});

egyszerűen megteheti:

Szálszál = új Szál (() -> System.out.println ("Hello World!"));

A funkcionális interfészeket általában a @FunctionalInterface annotáció - amely informatív és nem befolyásolja a szemantikát.

6. Alapértelmezett módszer

Q1. Mi az alapértelmezett módszer és mikor alkalmazzuk?

Az alapértelmezett módszer egy megvalósítással rendelkező módszer, amely megtalálható egy felületen.

Alapértelmezett módszerrel új funkcionalitást adhatunk egy interfészhez, miközben megmarad a visszafelé való kompatibilitás azokkal az osztályokkal, amelyek már megvalósítják a felületet:

nyilvános felület Jármű {public void move (); alapértelmezett void hoot () {System.out.println ("kukucskál!"); }}

Általában egy új absztrakt módszer hozzáadásakor az interfészhez az összes implementációs osztály megszakad, amíg az új absztrakt módszert be nem hajtja. A Java 8-ban ezt a problémát az alapértelmezett módszer használatával oldották meg.

Például, Gyűjtemény interfész nem rendelkezik az egyes módszer deklaráció. Így egy ilyen módszer hozzáadása egyszerűen megszakítaná az egész gyűjtemény API-t.

A Java 8 az alapértelmezett módszert vezeti be Gyűjtemény interfész alapértelmezett megvalósítása lehet az egyes metódus anélkül, hogy az interfészt megvalósító osztályoknak meg kellene követelniük ugyanezt.

Q2. Összeállítja a következő kódot?

@FunctionalInterface nyilvános felület Funkció2 {public V alkalmaz (T t, U u); alapértelmezett void count () {// növekményszámláló}}

Igen. A kód összeáll, mert követi a funkcionális interfész specifikációját, amely csak egyetlen absztrakt módszert határoz meg. A második módszer, számol, egy alapértelmezett módszer, amely nem növeli az absztrakt módszerek számát.

7. Lambda kifejezések

Q1. Mi a lambda kifejezés és mire használható?

Nagyon leegyszerűsítve a lambda kifejezés olyan funkció, amelyre hivatkozhatunk és objektumként továbbadhatjuk.

A Lambda kifejezések bevezetik a funkcionális stílus feldolgozását a Java-ban, és megkönnyítik a kompakt és könnyen olvasható kódok írását.

Emiatt a lambda kifejezések természetes néven helyettesítik az anonim osztályokat, mint metódus érveket. Az egyik fő felhasználásuk a funkcionális interfészek belső megvalósításainak meghatározása.

Q2. Magyarázza el a lambda kifejezés szintaxisát és jellemzőit

A lambda kifejezés két részből áll: a paraméter részből és a kifejezések részéből előre nyíllal elválasztva, az alábbiak szerint:

params -> kifejezések

Bármely lambda kifejezés a következő jellemzőkkel rendelkezik:

  • Opcionális típusnyilatkozat - a lambda bal oldalán lévő paraméterek deklarálásakor nem kell deklarálnunk a típusukat, mivel a fordító következtetni tud rájuk az értékeikből. Így int param ->… és param ->… mind érvényesek
  • Opcionális zárójelek - ha csak egyetlen paramétert deklarálunk, akkor nem kell zárójelbe tennünk. Ez azt jelenti, hogy param ->… és (param) ->… mind érvényesek. De ha egynél több paramétert deklarálnak, zárójelekre van szükség
  • Opcionálisan göndör nadrágtartó - ha a kifejezések részének csak egyetlen állítása van, akkor nincs szükség göndör zárójelekre. Ez azt jelenti param -> nyilatkozat és param -> {utasítás;} mind érvényesek. De göndör zárójelekre akkor van szükség, ha több állítás van
  • Opcionális visszatérési nyilatkozat - ha a kifejezés visszaad egy értéket, és göndör zárójelbe van tekerve, akkor nincs szükségünk visszatérési utasításra. Azt jelenti (a, b) -> {adja vissza a + b;} és (a, b) -> {a + b;} mindkettő érvényes

Ha többet szeretne megtudni a Lambda kifejezésekről, kövesse ezt és ezt a linket.

8. Nashorn Javascript

Q1. Mi a Nashorn a Java8-ban?

A Nashorn az új Javascript-feldolgozó motor a Java platformhoz, amely a Java 8-mal érkezett. A JDK 7-ig a Java platform ugyanarra a célra használta a Mozilla Rhino-t. mint Javascript feldolgozó motor.

A Nashorn jobban megfelel az ECMA által normalizált JavaScript specifikációnak és jobb futási teljesítményt nyújt, mint elődje.

Q2. Mi a JJS?

Java 8-ban, jjs az új futtatható vagy parancssori eszköz, amelyet a Javascript kód futtatására használnak a konzolon.

9. Patakok

Q1. Mi az a patak? Hogyan különbözik a gyűjteménytől?

Egyszerűbben fogalmazva: az adatfolyam egy iterátor, amelynek feladata, hogy egy sor műveletet fogadjon el az egyes elemekre vonatkozóan.

A patak egy forrásból, például egy gyűjteményből származó objektumok sorozatát jelenti, amely támogatja az összesítési műveleteket. Úgy tervezték, hogy a gyűjtemény feldolgozása egyszerű és tömör legyen. A gyűjteményekkel ellentétben az iteráció logikája a patak belsejében valósul meg, így olyan módszereket használhatunk, mint térkép és flatMap deklaratív feldolgozás elvégzéséért.

További különbség, hogy a Folyam Az API folyékony és lehetővé teszi a csővezetéket:

int összeg = Tömbök.folyam (új int [] {1, 2, 3}) .szűrő (i -> i> = 2) .térkép (i -> i * 3) .sum ();

És még egy fontos megkülönböztetés a gyűjteményektől, hogy a folyamokat eleve lustán töltik be és dolgozzák fel.

Q2. Mi a különbség a közbenső és a terminálműveletek között?

Az adatfolyam-műveletek csővezetékekké vannak egyesítve az adatfolyamok feldolgozásához. Minden művelet közbenső vagy terminális.

A köztes műveletek azok a műveletek, amelyek visszatérnek Folyam maga lehetővé teszi a patak további műveleteit.

Ezek a műveletek mindig lusták, vagyis nem dolgozzák fel a folyamot a hívás helyén, egy köztes művelet csak akkor képes feldolgozni az adatokat, ha van terminál művelet. Néhány közbenső művelet szűrő, térkép és flatMap.

A terminálműveletek leállítják a csővezetéket és megkezdik az adatfolyam feldolgozását. Az adatfolyamot az összes közbenső műveleten keresztül továbbítják a terminál működési hívása során. A terminálműveletek magukban foglalják az egyes, csökkenteni, gyűjteni és összeg.

Ha ezt a pontot haza akarjuk vezetni, nézzünk meg egy példát mellékhatásokkal:

public static void main (String [] args) {System.out.println ("Adatfolyam terminálüzem nélkül"); Tömbök.stream (új int [] {1, 2, 3}). Térkép (i -> {System.out.println ("duplázás" + i); visszatérés i * 2;}); System.out.println ("Streaming terminál működésével"); Tömbök.stream (új int [] {1, 2, 3}). Térkép (i -> {System.out.println ("duplázás" + i); visszatérés i * 2;}). Összeg (); }

A kimenet a következő lesz:

Streamelés terminálműködtetés nélkül Streamelés terminálműködtetéssel duplázás 1 duplázás 2 duplázás 3

Amint láthatja, a köztes műveletek csak akkor aktiválódnak, ha létezik terminálművelet.

Q3. Mi a különbség Térkép és flatMap Streamelés?

Különbség van az aláírás között térkép és flatMap. Általánosságban elmondható, hogy a térkép művelet visszaküldi a visszatérési értéket a rendes típusba, miközben flatMap nem.

Például a Választható, a térkép működés visszatérne Választható típus közben flatMap visszatérne Húr típus.

Tehát a leképezés után ki kell bontani (olvassa el a „lapít”) az objektumot az érték lekéréséhez, míg a lapos leképezés után nincs szükség arra, hogy az objektum már ellaposodott volna. Ugyanezt a koncepciót alkalmazzák a feltérképezésre és a lapos feltérképezésre Folyam.

Mindkét térkép és flatMap olyan közbenső adatfolyam műveletek, amelyek függvényt kapnak, és ezt a függvényt a stream minden elemére alkalmazzák.

A különbség az, hogy a térkép, ez a függvény értéket ad vissza, de a flatMap, ez a függvény egy adatfolyamot ad vissza. A flatMap a művelet eggyé „simítja” a folyamokat.

Itt van egy példa, ahol a felhasználók nevének és telefonjainak listáját térképezzük fel, és "simítjuk" le az összes használó telefon listájára. flatMap:

Térkép emberek = új 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")); Sorolja fel a telefonokat = emberek.értékek (). Stream () .flatMap (Gyűjtemény :: stream) .collect (Collectors.toList ());

Q4. Mi az a Stream Pipelining a Java 8-ban?

Az adatfolyam-vezetés az együttes műveletek fogalma. Ez úgy történik, hogy a folyamon előforduló műveleteket két kategóriára osztjuk: közbenső műveletekre és terminál műveletekre.

Minden közbenső művelet futás közben visszaküldi a Stream egy példányát, ezért tetszőleges számú köztes művelet állítható be feldolgozási folyamatot alkotó adatok feldolgozására.

Ezután egy terminálműveletnek kell lennie, amely visszaadja a végső értéket és lezárja a csővezetéket.

10. Java 8 Dátum és Idő API

Q1. Meséljen a Java 8 új dátum és idő API-ról

A Java fejlesztők számára régóta fennálló probléma az a szokásos fejlesztők által megkövetelt dátum és idő manipulációk nem megfelelő támogatása.

A meglévő osztályok, mint pl java.util.Dátum és SimpleDateFormatter nem biztonságosak a szálakban, ami potenciális párhuzamossági problémákhoz vezethet a felhasználók számára.

A rossz API-tervezés a régi Java Data API-ban is valóság. Itt csak egy gyors példa - évek múlva java.util.Dátum 1900-tól kezdődnek, a hónapok 1-től kezdődnek, a napok pedig 0-tól kezdődnek, ami nem túl intuitív.

Ezek és számos más kérdés a harmadik féltől származó dátum- és időtárak, például a Joda-Time népszerűségéhez vezetett.

E problémák megoldása és a JDK jobb támogatása érdekében egy új dátum és idő API-t terveztek a Java SE 8 számára a csomag alatt. java.time.

11. Következtetés

Ebben a cikkben megvizsgáltunk néhány nagyon fontos kérdést a technikai interjúk kérdéséhez, a Java 8 torzításával. Ez korántsem teljes lista, hanem csak olyan kérdéseket tartalmaz, amelyek szerintünk a legvalószínűbbek a Java minden új szolgáltatásában 8.

Még akkor is, ha még csak most indul, a Java 8 tudatlansága nem jó módja annak, hogy interjúban járjon, különösen akkor, ha a Java erősen megjelenik az ön önéletrajzában. Ezért fontos, hogy szánjon egy kis időt arra, hogy megértse az ezekre a kérdésekre adott válaszokat, és esetleg végezzen további kutatásokat.

Sok sikert az interjúban.

Következő » Memóriakezelés Java interjúkérdésekben (+ válaszok) « Korábbi Java osztály struktúra és inicializálási interjúk

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