Home » TreeSet in Java

Java TreeSet class

TreeSet class hierarchy

Java TreeSet class implements the Set interface that uses a tree for storage. It inherits AbstractSet class and implements the NavigableSet interface. The objects of the TreeSet class are stored in ascending order.

The important points about the Java TreeSet class are:

  • Java TreeSet class contains unique elements only like HashSet.
  • Java TreeSet class access and retrieval times are quiet fast.
  • Java TreeSet class doesn’t allow null element.
  • Java TreeSet class is non synchronized.
  • Java TreeSet class maintains ascending order.
  • Java TreeSet class contains unique elements only like HashSet.
  • Java TreeSet class access and retrieval times are quite fast.
  • Java TreeSet class doesn’t allow null elements.
  • Java TreeSet class is non-synchronized.
  • Java TreeSet class maintains ascending order.
  • The TreeSet can only allow those generic types that are comparable. For example The Comparable interface is being implemented by the StringBuffer class.

Internal Working of The TreeSet Class

TreeSet is being implemented using a binary search tree, which is self-balancing just like a Red-Black Tree. Therefore, operations such as a search, remove, and add consume O(log(N)) time. The reason behind this is there in the self-balancing tree. It is there to ensure that the tree height never exceeds O(log(N)) for all of the mentioned operations. Therefore, it is one of the efficient data structures in order to keep the large data that is sorted and also to do operations on it.

Synchronization of The TreeSet Class

As already mentioned above, the TreeSet class is not synchronized. It means if more than one thread concurrently accesses a tree set, and one of the accessing threads modify it, then the synchronization must be done manually. It is usually done by doing some object synchronization that encapsulates the set. However, in the case where no such object is found, then the set must be wrapped with the help of the Collections.synchronizedSet() method. It is advised to use the method during creation time in order to avoid the unsynchronized access of the set. The following code snippet shows the same.

Hierarchy of TreeSet class

As shown in the above diagram, the Java TreeSet class implements the NavigableSet interface. The NavigableSet interface extends SortedSet, Set, Collection and Iterable interfaces in hierarchical order.

TreeSet Class Declaration

Let’s see the declaration for java.util.TreeSet class.

Constructors of Java TreeSet Class

Constructor Description
TreeSet() It is used to construct an empty tree set that will be sorted in ascending order according to the natural order of the tree set.
TreeSet(Collection<? extends E> c) It is used to build a new tree set that contains the elements of the collection c.
TreeSet(Comparator<? super E> comparator) It is used to construct an empty tree set that will be sorted according to given comparator.
TreeSet(SortedSet<E> s) It is used to build a TreeSet that contains the elements of the given SortedSet.

Methods of Java TreeSet Class

Method Description
boolean add(E e) It is used to add the specified element to this set if it is not already present.
boolean addAll(Collection<? extends E> c) It is used to add all of the elements in the specified collection to this set.
E ceiling(E e) It returns the equal or closest greatest element of the specified element from the set, or null there is no such element.
Comparator<? super E> comparator() It returns a comparator that arranges elements in order.
Iterator descendingIterator() It is used to iterate the elements in descending order.
NavigableSet descendingSet() It returns the elements in reverse order.
E floor(E e) It returns the equal or closest least element of the specified element from the set, or null there is no such element.
SortedSet headSet(E toElement) It returns the group of elements that are less than the specified element.
NavigableSet headSet(E toElement, boolean inclusive) It returns the group of elements that are less than or equal to(if, inclusive is true) the specified element.
E higher(E e) It returns the closest greatest element of the specified element from the set, or null there is no such element.
Iterator iterator() It is used to iterate the elements in ascending order.
E lower(E e) It returns the closest least element of the specified element from the set, or null there is no such element.
E pollFirst() It is used to retrieve and remove the lowest(first) element.
E pollLast() It is used to retrieve and remove the highest(last) element.
Spliterator spliterator() It is used to create a late-binding and fail-fast spliterator over the elements.
NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) It returns a set of elements that lie between the given range.
SortedSet subSet(E fromElement, E toElement)) It returns a set of elements that lie between the given range which includes fromElement and excludes toElement.
SortedSet tailSet(E fromElement) It returns a set of elements that are greater than or equal to the specified element.
NavigableSet tailSet(E fromElement, boolean inclusive) It returns a set of elements that are greater than or equal to (if, inclusive is true) the specified element.
boolean contains(Object o) It returns true if this set contains the specified element.
boolean isEmpty() It returns true if this set contains no elements.
boolean remove(Object o) It is used to remove the specified element from this set if it is present.
void clear() It is used to remove all of the elements from this set.
Object clone() It returns a shallow copy of this TreeSet instance.
E first() It returns the first (lowest) element currently in this sorted set.
E last() It returns the last (highest) element currently in this sorted set.
int size() It returns the number of elements in this set.

Java TreeSet Examples

Java TreeSet Example 1:

Let’s see a simple example of Java TreeSet.

FileName: TreeSet1.java

Test it Now

Output:

Ajay  Ravi  Vijay  

Java TreeSet Example 2:

Let’s see an example of traversing elements in descending order.

FileName: TreeSet2.java

Test it Now

Output:

Traversing element through Iterator in descending order  Vijay  Ravi  Ajay  Traversing element through NavigableSet in descending order  Vijay  Ravi  Ajay  

Java TreeSet Example 3:

Let’s see an example to retrieve and remove the highest and lowest Value.

FileName: TreeSet3.java

Output:

Lowest Value: 12  Highest Value: 66  

Java TreeSet Example 4:

In this example, we perform various NavigableSet operations.

FileName: TreeSet4.java

Output:

Initial Set: [A, B, C, D, E]  Reverse Set: [E, D, C, B, A]  Head Set: [A, B, C]  SubSet: [B, C, D, E]  TailSet: [D, E]  

Java TreeSet Example 5:

In this example, we perform various SortedSetSet operations.

FileName: TreeSet5.java

Output:

Intial Set: [A, B, C, D, E]  Head Set: [A, B]  SubSet: [A, B, C, D]  TailSet: [C, D, E]  

Java TreeSet Example: Book

Let’s see a TreeSet example where we are adding books to the set and printing all the books. The elements in TreeSet must be of a Comparable type. String and Wrapper classes are Comparable by default. To add user-defined objects in TreeSet, you need to implement the Comparable interface.

FileName: TreeSetExample.java

Output:

101 Data Communications & Networking Forouzan Mc Graw Hill 4  121 Let us C Yashwant Kanetkar BPB 8  233 Operating System Galvin Wiley 6  

ClassCast Exception in TreeSet

If we add an object of the class that is not implementing the Comparable interface, the ClassCast Exception is raised. Observe the following program.

FileName: ClassCastExceptionTreeSet.java

When we compile the above program, we get the ClassCastException, as shown below.

Exception in thread "main" java.lang.ClassCastException: class Employee cannot be cast to class java.lang.Comparable (Employee is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')  at java.base/java.util.TreeMap.compare(TreeMap.java:1569)  at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776)  at java.base/java.util.TreeMap.put(TreeMap.java:785)  at java.base/java.util.TreeMap.put(TreeMap.java:534)  at java.base/java.util.TreeSet.add(TreeSet.java:255)  at ClassCastExceptionTreeSet.main(ClassCastExceptionTreeSet.java:52)  

Explanation: In the above program, it is required to implement a Comparable interface. It is because the TreeSet maintains the sorting order, and for doing the sorting the comparison of different objects that are being inserted in the TreeSet is must, which is accomplished by implementing the Comparable interface.


You may also like