HashMap与HashTable区别
1.出现时间
HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2。
HashMap要比HashTable出现得晚一些。
2.继承接口不同
hashmap源码为:
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
hashtable源码为:
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
3.初始化大小不同
底层数据结构相同
HashTable:大小为11,加载因子为0.75
public Hashtable(int initialCapacity, float loadFactor) {
if (initialCapacity <= 0) initialCapacity = 11;
if (loadFactor <= 0.0) loadFactor = 0.75f;
this.loadFactor = loadFactor;
}
public Hashtable(int initialCapacity) {
this(initialCapacity, 0.75f);
}
HashMap:大小为16,加载因子为0.75
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
4.对null值得处理不同
HashMap:HashMap是支持null键和null值的
if (key == null)
return putForNullKey(value);
HashTable:HashTable在遇到null时,会抛NullPointerException异常
if (value == null)
throw new NullPointerException();
5.扩容不同
HashMap:2倍扩容
void addEntry(int hash, K key, V value, int bucketIndex) {
if ((size >= threshold) && (null != table[bucketIndex])) {
resize(2 * table.length);
hash = (null != key) ? hash(key) : 0;
bucketIndex = indexFor(hash, table.length);
}
createEntry(hash, key, value, bucketIndex);
}
HashTable:扩容大小为二倍加1
int newCapacity = oldCapacity * 2 + 1;