Following table gives the differences: Hashtable vs HashMap
|Introduced with JDK 1.0 version, the starting version of Java||Introduced with JDK 1.2|
|Part of legacy classes (the data structures of JDK 1.0 are known as legacy classes)||Part of Collections framework|
|Methods of Hashtable are synchronized by default||Methods are not synchronized by default|
|Does not permit null values (trying to add, throws NullPointerException)||Permits null values (either key or value)|
|Enumeration interface is used for iterating keys||Iterator is used for iterating the keys|
|Enumerator is not fail-fast||Iterator is fail-fast|
|Safe for multithreaded applications||Better for non-threaded applications|
|Low performance due to synchronization||High performance|
|Hashtable is serialized||HashMap is not serialized|
Hashtable can make use of HashMap methods to get the features of collections framework. As of JDK 1.2, the Hashtable implements Map. Following is the class signature of Hashtable.
public class java.util.Hashtable extends java.util.Dictionary implements java.util.Map, java.lang.Cloneable, java.io.Serializable
What is synchronized?
The concept of synchronization comes in multithreading. In multithreaded applications, there is every chance that multiple threads accessing the same source of data at the same time. This results in data corruption and data inconsistency. Synchronization avoids this by allowing only one thread to access the resource of data at a time.
That is, when one thread is modifying the data of Hashtable, the other thread cannot modify. The other thread should wait until the first one completes its job. This is done by acquiring the lock on Hashtable by the first thread. The lock will not be released until the first completes its job.
What is fail-fast?
The concept of fail-fast comes with iterators. When an Iterator object is created and iteration is going on, the HashMap elements cannot be modified (like addition or deletion of elements cannot be done). This is explained programmatically in ConcurrentModificationException.
Even though the HashMap methods are not synchronized, we can obtain a synchronized HashMap optionally as follows.
Map m = Collections.synchronizeMap(HashMap);
About Hashing and Hashcode
Comparing two strings letter by letter in a for loop is a time taking process. To make faster, the JVM converts each string into an integer number called hashcode. Different strings with different sequence of characters have different hashcodes. Comparison with integer numbers gives maximum performance. Usage of hashcode numbers for comparison, searching of duplicate elements and identification is faster.
Hashing is process of converting a string or object into a 32-bit integer number. Two objects are said to be equal if their hashcodes are same. hashCode() is used in combination of equals() method. When compared, hashing is done automatically by the JVM. Hashing, in data structures, is done implicitly in the basic operations with add(), contains(), remove() and size() etc. Hashing is more useful to compare the sets of large content.