HashSet és TreeSet összehasonlítás

1. Bemutatkozás

Ebben a cikkben összehasonlítani fogjuk a java.util.Set interfész - HashSet és TreeSet.

2. Különbségek

HashSet és TreeSet ugyanazon ág levelei, de néhány fontos kérdésben különböznek egymástól.

2.1. Rendelés

HashSet az objektumokat véletlenszerű sorrendben tárolja, míg TreeSet az elemek természetes sorrendjét alkalmazza. Lássuk a következő példát:

@Test public void givenTreeSet_whenRetrievesObjects_thenNaturalOrder () {Set set = new TreeSet (); set.add ("Baeldung"); set.add ("is"); set.add ("Félelmetes"); assertEquals (3, set.size ()); assertTrue (set.iterator (). next (). egyenlő ("Félelmetes")); }

Miután hozzáadta a Húr tárgyakat TreeSet, látjuk, hogy az első „Félelmetes”, annak ellenére, hogy a legvégén adták hozzá. Hasonló művelet HashSet nem garantálja, hogy az elemek sorrendje állandó marad az idő múlásával.

2.2. Nulla Tárgyak

Egy másik különbség az HashSet tárolhatja nulla tárgyakat, míg TreeSet nem engedi meg nekik:

@Test (várható = NullPointerException.class) public void givenTreeSet_whenAddNullObject_thenNullPointer () {Set set = new TreeSet (); set.add ("Baeldung"); set.add ("is"); set.add (null); } @Test public void givenHashSet_whenAddNullObject_thenOK () {Set set = new HashSet (); set.add ("Baeldung"); set.add ("is"); set.add (null); assertEquals (3, set.size ()); }

Ha megpróbáljuk tárolni a nulla objektum a TreeSet, a művelet dobást eredményez NullPointerException. Az egyetlen kivétel a Java 7 volt, amikor engedélyezték, hogy pontosan egy legyen nulla elem a TreeSet.

2.3. Teljesítmény

Egyszerűen fogalmazva, HashSet gyorsabb, mint a TreeSet.

HashSet állandó idejű teljesítményt nyújt a legtöbb művelethez, például add (), eltávolítás () és tartalmaz (), szemben a napló(n) által felajánlott idő TreeSet.

Általában ezt láthatjuk az elemek hozzáadásának végrehajtási ideje TreeSet sokkal jobb, mint a HashSet.

Ne feledje, hogy a JVM lehet, hogy nincs felmelegedve, ezért a végrehajtás ideje eltérhet. Jó vita miként lehet mikroteszteket megtervezni és végrehajtani különféle módszerekkel Készlet megvalósítások itt érhetők el.

2.4. Megvalósított módszerek

TreeSet funkciókban gazdag, további módszerek bevezetésével, például:

  • pollFirst () - az első elem visszaadásához, vagy nulla ha Készlet üres
  • pollLast () - az utolsó elem lekérése és eltávolítása, vagy visszatérés nulla ha Készlet üres
  • első() - az első tétel visszaküldéséhez
  • utolsó()hogy visszaküldje az utolsó elemet
  • mennyezet() - az adott elemnél nagyobb vagy azzal egyenlő legkisebb elemet adja vissza, vagy nulla ha nincs ilyen elem
  • Alsó() - a legnagyobb elemet szigorúan kevesebbet adja vissza, mint az adott elem, vagy nulla ha nincs ilyen elem

A fent említett módszerek teszik TreeSet sokkal könnyebben használható és erősebb, mint HashSet.

3. Hasonlóságok

3.1. Egyedi elemek

Mindkét TreeSet és HashSet garancia a az elemek ismétlődő mentes gyűjtése, mivel az általános része Készlet felület:

@Test public void givenHashSetAndTreeSet_whenAddDuplicates_thenOnlyUnique () {Set set = new HashSet (); set.add ("Baeldung"); set.add ("Baeldung"); assertTrue (set.size () == 1); Set set2 = új TreeSet (); set2.add ("Baeldung"); set2.add ("Baeldung"); assertTrue (set2.size () == 1); }

3.2. Nem szinkronizált

A leírtak egyike sem Készlet megvalósítások vannak szinkronizált. Ez azt jelenti, hogy ha több szál hozzáfér a Készlet egyidejűleg, és legalább az egyik szál módosítja, akkor külsőleg szinkronizálni kell.

3.3. Gyorsan elterülő iterátorok

A Iterátors visszatért TreeSet és HashSet kudarcot vallanak.

Ez azt jelenti, hogy a Készlet bármikor a Iterátor létrejön dobja a ConcurrentModificationException:

@Test (várható = ConcurrentModificationException.class) public void givenHashSet_whenModifyWhenIterator_thenFailFast () {Set set = new HashSet (); set.add ("Baeldung"); Iterátor it = beállított.iterátor (); while (it.hasNext ()) {set.add ("Félelmetes"); it.next (); }}

4. Melyik megvalósítást használja?

Mindkét megvalósítás teljesíti a készlet ötletének szerződését, így attól a kontextustól függ, hogy melyik megvalósítást használhatjuk.

Íme néhány gyors emlékezetes dolog:

  • Ha bejegyzéseinket rendezni szeretnénk, akkor a TreeSet
  • Ha jobban értékeljük a teljesítményt, mint a memóriafogyasztást, akkor a HashSet
  • Ha kevés a memória, akkor a TreeSet
  • Ha olyan elemekhez szeretnénk hozzáférni, amelyek természetes sorrendjük szerint viszonylag közel vannak egymáshoz, érdemes megfontolni TreeSet mert nagyobb a lokalitása
  • HashSetTeljesítményét a kezdeti Kapacitás és terhelési tényező, ami nem lehetséges a TreeSet
  • Ha meg akarjuk őrizni a beillesztési sorrendet, és profitálni akarunk az állandó időben történő hozzáférésből, használhatjuk a LinkedHashSet

5. Következtetés

Ebben a cikkben kitértünk a különbségekre és hasonlóságokra TreeSet és HashSet.

Mint mindig, a cikk kódpéldái is elérhetők a GitHubon.


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