HashMap is used in the new framework instead of HashTable, Hashtable is not part of the Java Collections Framework - it just provides a similar API.
There are several differences between HashMap and Hashtable:
- Hashtable is synchronized, whereas HashMap is not.
- Hashtable does not allow null keys or values. HashMap allows one null key and any number of null values
- Enumeration is used in HashTable, but Iterator used in HashMap.
The upper are differences in appearance, there are also several differences in implement :
- The default size of hash array is 11 in Hashtable , the size to add is old*2+1. And the default size is 16 in HashMap, the size to add is 2^x
- The hashCode is different. HashTable directly uses the hashCOde of the key object:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
And HashMap recomputs the hashCode:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}