21.2.1 Általános célú Set implementációk

Három általános célú Set implementáció létezik: HashSet, TreeSet, és LinkedHashSet. Általában egyszerű eldönteni azt, hogy melyiket kell használni. A HashSet sokkal gyorsabb, mint a TreeSet (konstans végrehajtási idő szemben a logaritmikus idővel a legtöbb művelet esetén), de nem biztosít rendezhetőséget. Ha a SortedSet interfész műveleteire, vagy egy érték szerint rendezett iterációra van szükség, akkor a TreeSet használata javasolt, egyéb esetben a HashSet.

A LinkedHashSet bizonyos értelemben egy átmenetet képez a HashSet és a TreeSet között. Megvalósítását tekintve ez egy olyan hash-tábla, aminek elemei egy láncolt lista segítségével vannak összekötve, így rendezett-beszúrásos iterációt biztosít (a legritkábban használt elemet szúrja be a legsűrűbben használtba), és majdnem olyan gyorsan fut, mint a HashSet. A LinkedHashSet implementációja megkíméli a használóját az olyan nem specifikált, általában kaotikus rendezéstől, mint a HashSet esetében, valamint a TreeSet esetében felmerülő többlet költségektől is.

Figyelemre méltó, hogy HashSet használata esetén az iterációk száma lineárisan arányos a benne tárolt bejegyzések számával, valamint a beszúrások számával (a kapacitással). Emiatt egy túl magas kezdeti kapacitás választása esetén feleslegesen pazaroljuk az időt és a memóriát. Másrészt a túl alacsony kezdeti kapacitás választás esetén szintén időt vesztünk azzal, hogy az adatstruktúrát mindig át kell másolnunk, mikor a kapacitást növeljük. Ha nem specifikálunk kezdeti kapacitást, akkor az alapbeállítás lép érvénybe, ami 16. A kapacitást mindig felfele kerekítik a legközelebbi kettő hatványra. A kezdeti kapacitást a konstruktor int paramétereként adhatjuk meg. A következő kódsor egy olyan HashSet példány létrehozását mutatja be, ahol a kezdeti kapacitás 64.

Set<String> s= new HashSet<String>(64);

A LinkedHashSet-nek hasonló beállítási paraméterei vannak, mint a HashSet-nek, de az iteráció idejét nem befolyásolja a kapacitás. A TreeSet nem rendelkezik beállítási paraméterekkel.