hashmap和hashtable的区别
hashmap和hashtable的区别有:1、哈希计算方法不同;2、键值是否可以为空值;3、实现方式不同;4、初始化容量不同;5、扩容机制不同;6、支持的遍历种类不同;7、迭代器不同;8、添加key-value的hash值算法不同;9、部分API不同;10、同步性不同;11、性能不同。哈希计算方法不同是指hashmap在取模之前进行二次hash。
1、哈希计算方法不同
hashmap:HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取模。
hashtable:Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模。
2、键值是否可以为空值
hashmap:HashMap可以使用null作为key,不过建议还是尽量避免这样使用。HashMap以null作为key时,总是存储在table数组的名列前茅个节点上。
hashtable:Hashtable则不允许null作为key
3、实现方式不同
hashmap: HashMap 继承的是 AbstractMap 类。
hashtable:Hashtable 继承的是 Dictionary类。
4、初始化容量不同
hashmap:HashMap 的初始容量为:16。
hashtable:Hashtable 初始容量为:11。
两者的负载因子默认都是:0.75
5、扩容机制不同
hashmap:已用容量>总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍。
hashtable:已用容量>总容量 * 负载因子时,Hashtable 扩容规则为当前容量翻倍 +1。
6、支持的遍历种类不同
hashmap:HashMap只支持Iterator遍历。
hashtable:HashTable支持Iterator和Enumeration两种方式遍历。
7、迭代器不同
hashmap:HashMap的迭代器(Iterator)是fail-fast迭代器,所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。而Hashtable 则不会。
hashtable:Hashtable的enumerator迭代器不是fail-fast的。
8、添加key-value的hash值算法不同
hashmap:HashMap添加元素时,是使用自定义的哈希算法。
hashtable:添加元素时,HashTable是直接采用key的hashCode()。
9、部分API不同
hashmap:HashMap不支持contains(Object value)方法,没有重写toString()方法。
hashtable:HashTable支持contains(Object value)方法,而且重写了toString()方法。
10、同步性不同
hashmap:HashMap是一个不同步的Map,这意味着HashMap不是线程安全的,如果没有适当的同步代码,则无法在多个线程之间共享。
hashtable:Hashtable是一个同步的Map,Hashtable是线程安全的,可以在多个线程之间共享。如果您需要使用同步的 Map,Hashtable 比在同步包装器中使用 HashMap 更快。
11、性能不同
由于HashMap不是同步的Map,因此在性能方面它比Hashtable更快,更好,实际上,它比Hashtable使用更少的内存。虽然它们实际上是相同的,但Hashtable比HashMap慢一点,但比同步的HashMap快一点。从本质上讲,将 Hashtable 与多线程访问结合使用是不安全的,因为只有方法是同步的。Hashtable是HashMap的同步对应物。与同步对象相比,非同步对象的性能更好,就像 Hashtable 在单线程环境中的性能更好一样。