HashMap
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
- 非线程安全,HashMap可以通过下面的语句进行同步: Map m = Collections.synchronizeMap(hashMap)
- 键值对均能为null
- 迭代器Iterator,支持fast-fail
- 默认容量是16,装载因子是 0.75f
- 多次访问,映射元素的顺序可能不同(可能不变或者下标变为原来的二倍)
- 检测是否含有key时,HashMap内部需要将key的hash码重新计算一边再检测(跟容量有关系)
fast-fail
程序在对 collection 进行迭代时,某个线程对该 collection 在结构上对其做了修改(删除或者添加元素),这时迭代器就会抛出 ConcurrentModificationException 异常信息,从而产生 fail-fast
Hashtable
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
- 线程安全
- 键值对均不能为null
- 迭代器Iterator,支持fast-fail; Enumeration ,不支持fast-fail
- 默认容量是11,装载因子是 0.75f
- 多次访问,映射元素的顺序相同
- hash算法 ,Hashtable则直接利用key本身的hash码来做验证
HashMap和Hashtable的主要区别
- 线程安全性,同步(synchronization)
- 速度
建议
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。