原创

HashMap、HashTable、ConcurrentHashMap的差异

一、HashMap和Hashtable有何不同?

线程安全

Hashtable 中的方法是同步的,而HashMap中的方法在默认情况下是非同步的。

在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。

继承关系

Hashtable是基于陈旧的Dictionary类继承来的。 HashMap继承的抽象类AbstractMap实现了Map接口。

允不允许null值:

Hashtable中,key和value都不允许出现null值,否则会抛出NullPointerException异常(value值时判断逻辑,key值时使用逻辑)。

HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

Hashtable put部分源代码
```
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}

    // Makes sure the key is not already in the hashtable.
    Entry<?,?> tab[] = table;
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;

```

默认初始容量和扩容机制

Hashtable中的hash数组初始大小是11,增加的方式是 old*2+1。

HashMap中hash数组的默认大小是16,而且一定是2的指数。

哈希值的使用不同

Hashtable直接使用对象的hashCode。

HashMap重新计算hash值。

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

Hashtable、HashMap都使用了 Iterator。

而由于历史原因,Hashtable还使用了Enumeration的方式 。 HashMap 实现 Iterator,支持fast-fail,

Hashtable的 Iterator 遍历支持fast-fail,用 Enumeration 不支持 fast-fail

二、HashMap 和 ConcurrentHashMap 的区别?

  • ConcurrentHashMap和HashMap的实现方式不一样,虽然都是使用桶数组实现的,但ConcurrentHashMap对桶数组进行了分段,而HashMap并没有,仍然是数组+链表+红黑树。

  • ConcurrentHashMap在每一个分段上都用锁进行了保护。HashMap没有锁机制。所以,前者线程安全的,后者不是线程安全的。

正文到此结束
广告是为了更好的提供数据服务
本文目录