Java gyűjtemények interjúkérdések

Ez a cikk egy sorozat része: • Java Collections interjúkérdések (aktuális cikk) • Java típusú rendszer interjú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)

• Memóriakezelés 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

A Java Gyűjtemények olyan téma, amelyet gyakran felvetnek a Java fejlesztők számára készített technikai interjúk során. Ez a cikk áttekint néhány fontos kérdést, amelyet a leggyakrabban feltesznek, és trükkös lehet a helyes megoldás.

2. Kérdések

Q1. Ismertesse a Gyűjteménytípus hierarchiát. Melyek a fő interfészek, és mi a különbség közöttük?

A Iterálható interfész minden olyan gyűjteményt képvisel, amelyet a az egyes hurok. A Gyűjtemény interfész örökli Iterálható és általános módszereket ad hozzá annak ellenőrzésére, hogy egy elem van-e gyűjteményben, elemeket ad hozzá és távolít el a gyűjteményből, meghatározza annak méretét stb.

A Lista, Készlet, és Sor az interfészek öröklik a Gyűjtemény felület.

Lista rendezett gyűjtemény, és elemei a listában található indexük alapján érhetők el.

Készlet rendezetlen gyűjtemény, külön elemekkel, hasonló a halmaz matematikai fogalmához.

Sor az elemek hozzáadására, eltávolítására és vizsgálatára szolgáló további módszerekkel ellátott gyűjtemény, amely hasznos az elemek feldolgozás előtti megtartásához.

Térkép Az interfész szintén a gyűjtemény keretrendszerének része, de nem terjed ki Gyűjtemény. Ennek célja, hogy hangsúlyozza a különbségeket a gyűjtemények és a leképezések között, amelyeket nehéz összegyűjteni egy közös absztrakció alatt. A Térkép Az interfész egy kulcsértékű adatszerkezetet képvisel, egyedi kulcsokkal és minden kulcshoz legfeljebb egy értékkel.

Q2. Ismertesse a térképi felület különböző megvalósításait és azok felhasználási esetbeli különbségeit.

Az. Egyik leggyakrabban használt megvalósítása Térkép interfész a HashMap. Ez egy tipikus hash térképes adatstruktúra, amely lehetővé teszi az elemek állandó időben történő elérését, vagy O (1), de nem őrzi a rendet és nem szálbiztos.

Az elemek beszúrási sorrendjének megőrzéséhez használhatja a LinkedHashMap osztály, amely kiterjeszti a HashMap és emellett összekapcsolja az elemeket egy összekapcsolt listával, előre látható általános költségekkel.

A TreeMap osztály egy piros-fekete fa struktúrában tárolja elemeit, amely lehetővé teszi az elemek logaritmikus időben vagy O (log (n)) elérését. Lassabb, mint a HashMap a legtöbb esetben, de egyesek szerint lehetővé teszi az elemek rendben tartását Összehasonlító.

A ConcurrentHashMap a hash térkép szálbiztos megvalósítása. A lekérések teljes egyidejűségét biztosítja (mint a kap A művelet nem jelenti a zárolást) és a frissítések várhatóan nagy egyidejűségét.

A Hashtable osztály az 1.0 verzió óta Java-ban van. Nem elavult, de többnyire elavultnak számít. Ez egy szálbiztos hash térkép, de ellentétben ConcurrentHashMap, minden módszere egyszerűen szinkronizált, ami azt jelenti, hogy ezen a térképen minden művelet blokkolódik, még a független értékek visszakeresése is.

Q3. Magyarázza el a különbséget a Linkedlist és az Arraylist között.

Tömb lista megvalósítása a Lista tömbön alapuló felület. Tömb lista belsőleg kezeli ennek a tömbnek az átméretezését, amikor az elemeket hozzáadják vagy eltávolítják. Elemeit állandó időben elérheti a tömbben található indexük alapján. Egy elem beillesztésével vagy eltávolításával azonban következik az összes következõ elem elmozdulása, ami lassú lehet, ha a tömb hatalmas, és a beillesztett vagy eltávolított elem közel van a lista elejéhez.

LinkedList egy kétszeresen összekapcsolt lista: egyes elemek kerülnek be Csomópont objektumok, amelyek hivatkoznak az előzőre és a következőre Csomópont. Ez a megvalósítás hatékonyabbnak tűnhet, mint Tömb lista ha sok beillesztés vagy törlés van a lista különböző részeiben, különösen, ha a lista nagy.

A legtöbb esetben azonban Tömb lista felülmúlja LinkedList. Még elemek is bekapcsolódnak Tömb lista, miközben O (n) művelet, nagyon gyors System.arraycopy () hívás. Még gyorsabban is megjelenhet, mint a LinkedList’S O (1) beillesztés, amely megköveteli az a Csomópont objektumot és több hivatkozás frissítését a motorháztető alatt. LinkedList szintén nagy memóriaterülettel rendelkezhet több kicsi létrehozása miatt Csomópont tárgyakat.

Q4. Mi a különbség a Hashset és a Treeset között?

Mindkét HashSet és TreeSet osztályok valósítják meg a Készlet interfész és különálló elemek halmazát képviselik. Ezenkívül TreeSet végrehajtja a NavigableSet felület. Ez a felület olyan módszereket határoz meg, amelyek kihasználják az elemek sorrendjét.

HashSet belsőleg a HashMap, és TreeSet mögött áll a TreeMap példány, amely meghatározza azok tulajdonságait: HashSet az elemeket nem tartja külön sorrendben. Iteráció az elemek felett a HashSet megkevert sorrendben állítja elő őket. TreeSetmásrészt bizonyos sorrendben elemeket állít elő előre meghatározottak szerint Összehasonlító.

Q5. Hogyan valósul meg a Hashmap a Java-ban? Hogyan használja a megvalósítása az objektumok Hashcode és egyenlő módszereit? Milyen bonyolult az elem elhelyezése és megszerzése egy ilyen struktúrából?

A HashMap osztály egy tipikus hash térkép adatstruktúrát képvisel, bizonyos tervezési lehetőségekkel.

A HashMap egy átméretezhető tömb mögött van, amelynek mérete kettő. Ha az elemet hozzáadjuk a HashMap, először annak hash kód kiszámításra kerül (an int érték). Ezután ennek az értéknek bizonyos számú alacsonyabb bitjét használjuk tömbindexként. Ez az index közvetlenül a tömb cellájára mutat (úgynevezett vödör), ahová ezt a kulcs-érték párot el kell helyezni. Az elemhez való hozzáférés egy tömb indexe alapján nagyon gyors O (1) művelet, amely a hash térképszerkezet fő jellemzője.

A hash kód azonban nem egyedülálló, sőt, másként is hashCodes, ugyanazt a tömb pozíciót kaphatjuk meg. Ezt hívják ütközésnek. Az ütközések megoldásának többféle módja van a hash map adatstruktúrákban. Java-ban HashMap, minden vödör valójában nem egyetlen objektumra vonatkozik, hanem egy vörös-fekete fára az összes objektumról, amely ebben a vödörben landolt (a Java 8 előtt ez egy összekapcsolt lista volt).

Tehát amikor a HashMap meghatározta a kulcstartót, meg kell haladnia ezen a fán, hogy a kulcs-érték pár a helyére kerüljön. Ha az ilyen kulccsal rendelkező pár már létezik a vödörben, akkor azt egy újra cserélik.

Az objektum kulcsával történő letöltéséhez a HashMap ismét ki kell számolnia a hash kód a kulcshoz keresse meg a megfelelő vödröt, haladjon át a fán, hívjon egyenlő a fa kulcsain, és keresse meg a megfelelőt.

HashMap O (1) komplexitása vagy állandó idejű komplexitása van az elemek elhelyezésének és megszerzésének. Természetesen a sok ütközés a legrosszabb esetben O (log (n)) idő komplexitásra ronthatja a teljesítményt, amikor az összes elem egyetlen vödörben landol. Ezt általában úgy oldják meg, hogy jó elosztási funkciót biztosítsanak egyenletes eloszlás mellett.

Amikor az HashMap belső tömb kitöltve (erről bővebben a következő kérdésben), automatikusan átméretezik, hogy kétszer nagyobb legyen. Ez a művelet következtet az újragyakorlásra (a belső adatstruktúrák újjáépítése), ami költséges, ezért meg kell terveznie a HashMap előzetesen.

Q6. Mi a célja a hasmap kezdeti kapacitásának és terhelési tényezőjének? Melyek az alapértelmezett értékeik?

A kezdeti Kapacitás érvelése HashMap A konstruktor befolyásolja a. belső adatstruktúrájának méretét HashMap, de a térkép tényleges méretével kapcsolatos okfejtés kissé trükkös. A HashMapBelső adatstruktúrája egy kettős teljesítményű tömb. Így a kezdeti Kapacitás Az argumentum értéke a következő kettőre növekszik (például ha 10-re állítja, akkor a belső tömb tényleges mérete 16 lesz).

Az a terhelési tényező HashMap az elemszám aránya osztva a vödörszámmal (azaz a belső tömb méretével). Például, ha egy 16 vödör HashMap 12 elemet tartalmaz, terhelési tényezője 12/16 = 0,75. A nagy terhelési tényező sok ütközést jelent, ami viszont azt jelenti, hogy a térképet át kell méretezni a következő kettőre. Így a terhelési tényező argumentum a térkép terhelési tényezőjének maximális értéke. Amikor a térkép eléri ezt a terhelési tényezőt, átméretezi belső tömbjét a következő kettős teljesítményértékre.

A kezdeti Kapacitás alapértelmezés szerint 16, a loadFactor pedig alapértelmezés szerint 0,75, így 12 elemet tehetne az a-ba HashMap amit az alapértelmezett konstruktorral példányosítottak, és nem fog átméretezni. Ugyanez vonatkozik a HashSet, amelyet a HashMap például belsőleg.

Következésképpen nem triviális előállni kezdeti Kapacitás amely kielégíti az Ön igényeit. Ezért van a guavai könyvtárban Maps.newHashMapWithExpectedSize () és Sets.newHashSetWithExpectedSize () módszerek, amelyek lehetővé teszik a HashMap vagy a HashSet amely átméretezés nélkül elfér a várt számú elemen.

Q7. Ismertesse az Enums speciális gyűjteményeit. Milyen előnyökkel jár a megvalósítás a szokásos gyűjteményekkel összehasonlítva?

EnumSet és EnumMap speciális megvalósításai Készlet és Térkép az interfészek ennek megfelelően. Mindig használja ezeket a megvalósításokat, amikor enumokkal foglalkozik, mert nagyon hatékonyak.

An EnumSet csak egy kis vektor, ahol az „egyek” vannak a halmazban jelen lévő összegek sorszámának megfelelő pozíciókban. Annak ellenőrzéséhez, hogy van-e enum érték a halmazban, a megvalósításnak egyszerűen meg kell vizsgálnia, hogy a vektor megfelelő bitje egy-e, ami nagyon egyszerű művelet. Hasonlóképpen egy EnumMap egy tömb, amelyhez az enum rendes értéke indexként érhető el. Abban az esetben EnumMap, nincs szükség hash kódok kiszámítására vagy az ütközések feloldására.

Q8. Mi a különbség a hibamentes és a hibamentes iterátorok között?

A különböző gyűjtemények iterátorai hibamentesek vagy hibamentesek, attól függően, hogy hogyan reagálnak az egyidejű módosításokra. Az egyidejű módosítás nem csak egy másik szálból származó gyűjtemény módosítása, hanem ugyanazon szál módosítása is, de egy másik iterátor használatával vagy a gyűjtemény közvetlen módosításával.

Gyorsan iterátorok (akik visszatérnek HashMap, Tömb lista, és más, nem szálon biztonságos gyűjtemények) megismétlik a gyűjtemény belső adatszerkezetét, és dobnak ConcurrentModificationException amint egyidejű módosítást észlelnek.

Üzembiztos iterátorok (szálbiztos gyűjtemények adják vissza, mint pl ConcurrentHashMap, CopyOnWriteArrayList) hozzon létre egy példányt az általa iterált struktúráról. Garantálják a biztonságot az egyidejű módosításoktól. Hátrányuk a túlzott memóriafogyasztás és az esetlegesen elavult adatok feletti iteráció, amennyiben a gyűjtemény módosulna.

Q9. Hogyan lehet összehasonlítható és összehasonlító interfészeket használni a gyűjtemények rendezéséhez?

A Hasonló az interfész olyan objektumok interfésze, amelyek bizonyos sorrend szerint összehasonlíthatók. Egyetlen módszere az összehasonlítani, amely két értéken működik: maga az objektum és az azonos típusú argumentum objektum. Például, Egész szám, Hosszú, és más numerikus típusok valósítják meg ezt az interfészt. Húr ezt az interfészt is megvalósítja, és annak összehasonlítani módszer összehasonlítja a húrokat lexikográfiai sorrendben.

A Hasonló felület lehetővé teszi a megfelelő objektumok listájának rendezését a Collections.sort () módszert, és tartsa fenn az iterációs sorrendet a megvalósító gyűjteményekben SortedSet és SortedMap. Ha az objektumokat valamilyen logika alapján lehet rendezni, akkor végre kell hajtaniuk a Hasonló felület.

A Hasonló az interfész általában az elemek természetes rendezésével valósul meg. Például mindet Egész szám a számok kisebb értékről nagyobbra vannak rendezve. De néha érdemes másfajta sorrendet is megvalósítani, például a számok csökkenő sorrendbe rendezéséhez. A Összehasonlító interfész itt segíthet.

A rendezni kívánt objektumok osztályának nem kell megvalósítania ezt a felületet. Egyszerűen létrehoz egy megvalósító osztályt, és meghatározza a hasonlítsa össze módszer, amely két objektumot fogad és eldönti, hogyan rendelje meg őket. Ezután felhasználhatja ennek az osztálynak a példányát az osztály természetes sorrendjének felülbírálására Collections.sort () módszer vagy SortedSet és SortedMap példányok.

Mivel a Összehasonlító Az interfész egy funkcionális interfész, lecserélheti egy lambda kifejezésre, a következő példa szerint. Ez egy lista rendezését mutatja természetes sorrendben (Egész szám’S Hasonló interfész) és egy egyedi iterátor (Összehasonlító felület).

List list1 = Tömbök.asList (5, 2, 3, 4, 1); Gyűjtemények.rendezés (lista1); assertEquals (új egész szám (1), lista1.get (0)); List list1 = Tömbök.asList (5, 2, 3, 4, 1); Gyűjtemények.rendezés (lista1, (a, b) -> b - a); assertEquals (új egész szám (5), list1.get (0));
Következő » Java típusú rendszerinterjúkérdések