HashMap和Hashtable区别

  1. Hashtable基于陈旧的Dictionary类,而HashMap则是基于AbstractMap类
1
2
3
4
5
6
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
  1. HashMap是非线程安全的,Hashtable则是线程安全的
  2. HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。Hashtable在put()时,使用null时不会出现编译错误,但在运行的时候会出现空指针异常
1
2
3
4
5
6
7
8
9
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
  1. HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
1
2
3
4
5
6
7
8
9
10
11
//Hashtable默认容量
public Hashtable() {
this(11, 0.75f);
}
//Hashtable扩容方法
int newCapacity = (oldCapacity << 1) + 1;
//HashMap默认容量
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
//HashMap扩容方式
newCap = oldCap << 1
  1. 对hash值的计算不同,Hashtable直接使用对象的hashCode值,而HashMap则重新求
1
2
3
4
5
6
7
8
//Hashtable
hash = key.hashCode();
index = (hash & 0x7FFFFFFF) % tab.length;
//HashMap
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}