Synchronized TreeMap

The implementation of a TreeMap is not synchronized. This means that if multiple threads access a tree set concurrently, and at least one of the threads modifies the set, it must be synchronized externally. This is typically accomplished by using the Collections.synchronizedSortedSet method. This is best done at the creation time, to prevent accidental unsynchronized access to the set. This can be done as:

SortedMap m = Collections.synchronizedSortedMap(new TreeMap(…));

How Does the TreemMap work Internally?

The methods in a TreeMap while getting keyset and values, return an Iterator that are fail-fast in nature. Thus, any concurrent modification will throw ConcurrentModificationException. A TreeMap is based upon a redblack tree data structure. Each node in the tree has:

  • 3 Variables (K key=Key, V value=Value, boolean color=Color)
  • 3 References (Entry left = Left, Entry right = Right, Entry parent = Parent)

In order to create a TreeMap, we need to create an object of the TreeMap class. The TreeMap class consists of various constructors that allow the possible creation of the TreeMap. The following are the constructors available in this class:

1. TreeMap(): This constructor is used to build an empty treemap that will be sorted by using the natural order of its keys. Let’s understand this with an example:

// Java program to demonstrate an

// example of TreeMap using the

// default constructor

import java.util.*;

import java.util.concurrent.*;

public class TreeMapImplementation {

// Function to show TreeMap()

// constructor example

static void Example1stConstructor()

{

// Creating an empty TreeMap

TreeMap<Integer, String> tree_map

= new TreeMap<Integer, String>();

// Mapping string values to int keys

tree_map.put( 10 , "Geeks" );

tree_map.put( 15 , "4" );

tree_map.put( 20 , "Geeks" );

tree_map.put( 25 , "Welcomes" );

tree_map.put( 30 , "You" );

// Displaying the TreeMap

System.out.println( "TreeMap: "

+ tree_map);

}

// Driver code

public static void main(String[] args)

{

System.out.println( "TreeMap using "

+ "TreeMap() constructor:\n" );

Example1stConstructor();

}

}

Output:

TreeMap using TreeMap() constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}

2. TreeMap(Comparator comp): This constructor is used to build an empty TreeMap object in which the elements will need an external specification of the sorting order. Let’s understand this with an example:

// Java program to demonstrate

// an example of TreeMap using

// a comparator constructor

import java.util.*;

import java.util.concurrent.*;

// A class to represent a student.

class Student {

int rollno;

String name, address;

// Constructor

public Student( int rollno, String name,

String address)

{

this .rollno = rollno;

this .name = name;

this .address = address;

}

// Used to print student details

// in main()

public String toString()

{

return this .rollno + " "

+ this .name + " "

+ this .address;

}

}

// Comparator implementattion

class Sortbyroll

implements Comparator<Student> {

// Used for sorting in ascending order of

// roll number

public int compare(Student a, Student b)

{

return a.rollno - b.rollno;

}

}

public class TreeMapImplementation {

static void Example2ndConstructor()

{

// Creating an empty TreeMap

TreeMap<Student, Integer> tree_map

= new TreeMap<Student, Integer>( new Sortbyroll());

// Mapping string values to int keys

tree_map.put( new Student( 111 , "bbbb" ,

"london" ),

2 );

tree_map.put( new Student( 131 , "aaaa" ,

"nyc" ),

3 );

tree_map.put( new Student( 121 , "cccc" ,

"jaipur" ),

1 );

// Displaying the TreeMap

System.out.println( "TreeMap: "

+ tree_map);

}

public static void main(String[] args)

{

System.out.println( "TreeMap using "

+ "TreeMap(Comparator)"

+ " constructor:\n" );

Example2ndConstructor();

}

}

Output:

TreeMap using TreeMap(Comparator) constructor: TreeMap: {111 bbbb london=2, 121 cccc jaipur=1, 131 aaaa nyc=3}

3. TreeMap(Map M): This constructor is used to initialize a TreeMap with the entries from the given map M which will be sorted by using the natural order of the keys. Let’s understand this with an example:

// Java program to demonstrate an

// example of TreeMap using the

// default constructor

import java.util.*;

import java.util.concurrent.*;

public class TreeMapImplementation {

static void Example3rdConstructor()

{

// Creating a Map

Map<Integer, String> hash_map

= new HashMap<Integer, String>();

// Mapping string values to int keys

hash_map.put( 10 , "Geeks" );

hash_map.put( 15 , "4" );

hash_map.put( 20 , "Geeks" );

hash_map.put( 25 , "Welcomes" );

hash_map.put( 30 , "You" );

// Creating the TreeMap using the Map

TreeMap<Integer, String> tree_map

= new TreeMap<Integer, String>(hash_map);

// Displaying the TreeMap

System.out.println( "TreeMap: "

+ tree_map);

}

public static void main(String[] args)

{

System.out.println( "TreeMap using "

+ "TreeMap(Map)"

+ " constructor:\n" );

Example3rdConstructor();

}

}

Output:

TreeMap using TreeMap(Map) constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}

4. TreeMap(SortedMap sm): This constructor is used to initialize a TreeMap with the entries from the given sorted map which will be stored in the same order as the given sorted map. Let’s understand this with an example:

// Java program to demonstrate an

// example of TreeMap using the

// sortedmap constructor

import java.util.*;

import java.util.concurrent.*;

public class TreeMapImplementation {

// Function to show

// TreeMap(SortedMap) constructor example

static void Example4thConstructor()

{

// Creating a SortedMap

SortedMap<Integer, String> sorted_map

= new ConcurrentSkipListMap<Integer, String>();

// Mapping string values to int keys

sorted_map.put( 10 , "Geeks" );

sorted_map.put( 15 , "4" );

sorted_map.put( 20 , "Geeks" );

sorted_map.put( 25 , "Welcomes" );

sorted_map.put( 30 , "You" );

// Creating the TreeMap using the SortedMap

TreeMap<Integer, String> tree_map

= new TreeMap<Integer, String>(sorted_map);

// Displaying the TreeMap

System.out.println( "TreeMap: "

+ tree_map);

}

// Driver code

public static void main(String[] args)

{

System.out.println( "TreeMap using "

+ "TreeMap(SortedMap)"

+ " constructor:\n" );

Example4thConstructor();

}

}

Output:

TreeMap using TreeMap(SortedMap) constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}