HashMap和HashTable的区别

Posted YaoYong_BigData

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap和HashTable的区别相关的知识,希望对你有一定的参考价值。

1 ) 继承不同

第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。

public class HashMap<K, V> extends AbstractMap<K, V> implements Cloneable, Serializable ...
public class Hashtable<K, V> extends Dictionary<K, V> implements Map<K, V>, Cloneable, Serializable ...
 
  • 1
  • 2

而HashMap继承的抽象类AbstractMap实现了Map接口:

public abstract class AbstractMap<K, V> implements Map<K, V> ...


2)线程安全不同

        HashMap的方法是非同步的,若要在多线程下使用HashMap,需要我们额外的进行同步处理。对HashMap处理可以使用Collections类提供的synchronizedMap静态方法,或者直接使用JDK5.0之后提供的java.util.concurrent包里的ConcurrentHashMap类。

        HashTable几乎所有方法都是同步的,前面都加了synchronized关键字,它支持多线程。


3 ) 允不允许null值

从上面的put()方法源码可以看到,Hashtable中,key和value都不允许出现null值,否则会抛出NullPointerException异常。 
而在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。


4 ) 遍历方式的内部实现上不同 

Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。


5)初始容量和扩容方式不同

        HashMap的默认容量是16,,扩容时,每次将容量变为原来的2倍

        HashTable的默认容量是11,扩容时,每次将容量变为原来的2倍+1


6)添加key-value的hash值算法不同

        HashMap添加元素时,是使用自定义的哈希算法

        HashTable是直接采用key的hashCode()


【总结】:

HashMap

线程不安全

允许有null的键和值

效率高一点、

方法不是Synchronize的要提供外同步

有containsvalue和containsKey方法

HashMap 是Java1.2 引进的Map interface 的一个实现

HashMap是Hashtable的轻量级实现

Hashtable

线程安全

不允许有null的键和值

效率稍低、

方法是是Synchronize的

有contains方法方法

、Hashtable 继承于Dictionary 类

Hashtable 比HashMap 要旧





以上是关于HashMap和HashTable的区别的主要内容,如果未能解决你的问题,请参考以下文章

hashMap和hashTable区别

HashMap 和 HashTable 区别

HashMap和Hashtable的区别

HashMap和Hashtable的区别

HashMap和Hashtable的区别 源码分析

HashTable和HashMap区别