HashMap和HashTable的区别
Posted YaoYong_BigData
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap和HashTable的区别相关的知识,希望对你有一定的参考价值。
1 ) 继承不同
第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
- 1
- 2
而HashMap继承的抽象类AbstractMap实现了Map接口:
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的区别的主要内容,如果未能解决你的问题,请参考以下文章