Hashset is designed not to accept duplicates !. So if your set does not contain given element it will add it to the set. If however in your set such element appears 2nd (same) element will not be added and will be discarded.
HashSet:
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 it's constructor) 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
implementation 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.