– Nos, milyen a processzorod?

"Rendben van. Egy órát ültem folyékony nitrogénben, szóval most olyan vagyok, mint az új!"

– Remek. Akkor folytassuk.

"Set gyűjtemények."

Matematikailag a halmaz egyedi elemek csoportja. Így a programozásban a készlet egyedi elemek gyűjteménye, azaz olyan gyűjtemény, amely nem teszi lehetővé az azonos elemek tárolását.

"Nem tudom, hogy Ellie megmutatta-e neked Set öröklési hierarchiáját. Ha nem, akkor itt van:"

A Set és Queue interfészek megvalósításai - 1

"A HashSet olyan gyűjtemény, amely belsőleg tárolja az elemeket a hashCode () metódus által visszaadott hash értékek használatával."

"Az egyszerűség kedvéért a HashSet<E> egy HashMap<E, Object> objektumot tárol, amely kulcsként tárolja a HashSet értékeit."

– Hűha!

"A hash kódok segítségével gyorsan megkereshet, hozzáadhat és eltávolíthat elemeket a készletből."

"De ne feledje, hogy az osztálynak megfelelően meg kell valósítania a hashCode & equals metódusokat ahhoz, hogy osztályai objektumait hozzáadhassa egy halmazhoz, és ott helyesen megtalálhassa őket."

"Mindkét módszert gyakran használják a HashSet/HashMap belsejében. "

"Ha elfelejti megvalósítani a hashCode () metódust, akkor fennáll annak a veszélye, hogy nem találja meg az objektumát a készletben, még akkor sem, ha az jelen van."

"Igen, emlékszem, emlékszem. Erről korábban meséltél. Mindent hallottam róla."

"Rendben. Akkor itt van még néhány hasznos információ."

"Tegyük fel, hogy megfelelően implementáltad a hashCode-ot és az equals-t  az osztályodban, és boldogan tárolod az objektumokat egy készletben."

"De akkor elmész és megváltoztatod az egyik objektumot, és ezzel megváltoztatod a hash kiszámításához használt belső adatokat . Tehát az objektum hash megváltozik."

"Ez pedig azt jelenti, hogy amikor rákeresel a Készletben, valószínűleg nem találod meg."

"Hú! Ez hogy működik?"

"Ez egy jól ismert buktató a hashekkel való munka során. Lényegében a HashSet (és a HashMap) keresések csak akkor működnek megfelelően, ha az objektumok megváltoztathatatlanok . "

"Hú! És mi van, senki nem tesz ellene semmit?"

"Mindenki úgy tesz, mintha a probléma nem létezne. De ez gyakran előjön az interjúkban, így érdemes lehet emlékezni…"

"A LinkedHashSet olyan HashSet, amelynek elemei szintén egy linkelt listában vannak tárolva. A normál HashSet-ek nem támogatják az elemek sorrendjét. Először is egyszerűen nem hivatalos művelet. Másodszor, még a belső sorrend is jelentősen megváltozhat, ha egyetlen elem hozzáadva."

De beszerezhet egy iterátort a LinkedHashSet- ből , és azzal az összes elemen végigmenhet abban a sorrendben, ahogyan azokat hozzáadták a LinkedHashSethez . Ritkán fordul elő, de néha nagyon nagy szükség van rá."

"Értem. Imádom, amikor léteznek osztályok ezekhez a "csak arra az esetre" forgatókönyvekre. Az ilyen esetek nem is olyan ritkák.

" A TreeSet egy gyűjtemény, amely az elemeket értékek szerint rendezett fa formájában tárolja. A TreeSet <E> egy TreeMap <E, Object> elemet tartalmaz, amely ezeket az értékeket tárolja. Ez a TreeMap pedig egy kiegyensúlyozott piros -fekete fát használ a tároláshoz. Ennek eredményeként támogatja a nagyon gyors hozzáadást, eltávolítást, és műveleteket is tartalmaz."

"Igen, emlékszem. Nemrég beszéltük meg ezt. És azon is gondolkodtam, hogy hol használják ezt."

"És kiderült, hogy a Java legnépszerűbb gyűjteményei közül néhány ezt használja."

"Igen. A kérdezők egyébként gyakran kérdeznek a TreeSetről . Általában be akarnak csapni. Azt mondják: "Ha egy TreeSet bináris fát használ, akkor minden elem egy hosszú ágat alkothat, így a keresés egy ideig tart. „Éppen itt az ideje, hogy a helyére tegyük a pimasz fickót azzal, hogy kijelentjük: „Még egy gyerek is tudja, hogy a TreeSet és a TreeMap kiegyensúlyozott vörös-fekete fákat használ , így ez a helyzet valójában lehetetlen.”

"Ah. Szívesen látnám annak a személynek az arcát, aki feltette ezt a kérdést. Talán még meg is jegyzem ezt a kifejezést..."

"A gyakorlatban azonban kiderült, hogy Set nem olyan egyszerű, mint azt először hittem."

"Másrészt a Queue helyzete sokkal egyszerűbb:"

A Set és Queue interfészek megvalósításai - 2

" A Queue egy sort valósít meg. Az elemek a sor végére kerülnek, és elölről kerülnek."

" A PriorityQueue valójában a Queue felület egyetlen klasszikus megvalósítása , nem számítva a LinkedList-et , amely technikailag szintén egy sor."

"Rendben, kezdek elfáradni. Mára ennyi. A következő alkalomig."