【Java集合】HashMap和Hashtable

时间:2023-02-24 17:34:00

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的扩展性更好。

参考

参考1

参考2