– 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 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 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."
GO TO FULL VERSION