Difference between Hashtable, HashMap, TreeMap and LinkedHashMap
Map is one of the most important data structures and when we talk about Map all these 4 implementation classes (Hashtable, HashMap, TreeMap and LinkedHashMap) are most used. Hashtable, HashMap and LinkedHashMap are directly implements Map interface, but TreeMap implements Map interface through implementing SortedMap. Below are the few differences between these classes |
- HashMap implemented as same as Hashtable except it is unsynchronized and permits null. As common both HashMap and Hashtable won't have any ordering on keys or values.
- TreeMap implemented based on red-black tree structure and it follows natural ordering on key.
- LinkedHashMap is a subclass of HashMap and inherits all properties of HashMap class and additionally its ordering will based on insertion order.
- If we use any Map implementation classes and if the key is user-defined class Object then we need to override hashcode() and equals() methods.
- Next when we use TreeMap, by default they are sorted by keys. If we use user-defined class Object for key, then to compare with each other we need to implement Comparable interface.
Next lets see simple examples for each classes.
Hashtable:
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new Hashtable<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
map.put("4", "four");
map.put("5", "five");
Iterator<?> itr = map.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry myMap = (Map.Entry) itr.next();
System.out.println(myMap.getKey() + " : " + myMap.getValue());
}
}
}
OUTPUT:
5 : five
4 : four
3 : three
2 : two
1 : one
HashMap:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
map.put("4", "four");
map.put("5", "five");
Iterator<?> itr = map.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry myMap = (Map.Entry) itr.next();
System.out.println(myMap.getKey() + " : " + myMap.getValue());
}
}
}
OUPTUT:
3 : three
2 : two
1 : one
5 : five
4 : four
TreeMap:
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new TreeMap<String, String>();
map.put("2", "two");
map.put("3", "three");
map.put("1", "one");
map.put("4", "four");
map.put("5", "five");
Iterator<?> itr = map.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry myMap = (Map.Entry) itr.next();
System.out.println(myMap.getKey() + " : " + myMap.getValue());
}
}
}
OUTPUT:
1 : one
2 : two
3 : three
4 : four
5 : five
LinkedHashMap:
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("2", "two");
map.put("3", "three");
map.put("1", "one");
map.put("4", "four");
map.put("5", "five");
Iterator<?> itr = map.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry myMap = (Map.Entry) itr.next();
System.out.println(myMap.getKey() + " : " + myMap.getValue());
}
}
}
OUTPUT:
2 : two
3 : three
1 : one
4 : four
5 : five