HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaCritical

In which cases should I use a HashSet over a TreeSet?

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
treesethashsetshoulduseovercaseswhich

Problem

I've always loved trees, that nice O(n*log(n)) and the tidiness of them. However, every software engineer I've ever known has asked me pointedly why I would use a TreeSet. From a CS background, I don't think it matters all that much which you use, and I don't care to mess around with hash functions and buckets (in the case of Java).

In which cases should I use a HashSet over a TreeSet?

Solution

HashSet is much faster than TreeSet (constant-time versus log-time for most operations like add, remove and contains) but offers no ordering guarantees like TreeSet.

HashSet

  • the class offers constant time performance for the basic operations (add, remove, contains and size).



  • it does not guarantee that the order of elements will remain constant over time



  • iteration performance depends on the initial capacity and the load factor of the HashSet.



  • It's quite safe to accept default load factor but you may want to specify an initial capacity that's about twice the size to which you expect the set to grow.



TreeSet

  • guarantees log(n) time cost for the basic operations (add, remove and contains)



  • guarantees that elements of set will be sorted (ascending, natural, or the one specified by you via its constructor) (implements SortedSet)



  • doesn't offer any tuning parameters for iteration performance



  • offers a few handy methods to deal with the ordered set like first(), last(), headSet(), and tailSet() etc



Important points:

  • Both guarantee duplicate-free collection of elements



  • It is generally faster to add elements to the HashSet and then convert the collection to a TreeSet for a duplicate-free sorted traversal.



  • None of these implementations are synchronized. That is if multiple threads access a set concurrently, and at least one of the threads modifies the set, it must be synchronized externally.



  • LinkedHashSet is in some sense intermediate between HashSet and TreeSet. Implemented as a hash table with a linked list running through it, however,it provides insertion-ordered iteration which is not same as sorted traversal guaranteed by TreeSet.



So a choice of usage depends entirely on your needs but I feel that even if you need an ordered collection then you should still prefer HashSet to create the Set and then convert it into TreeSet.

  • e.g. SortedSet s = new TreeSet(hashSet);

Context

Stack Overflow Q#1463284, score: 881

Revisions (0)

No revisions yet.