HashMap和ConcurrentHashMap和Hashtable的区别

HashMap和Hashtable的区别

1.线程安全不同

  • HashMap是非线程安全的,只是用于单线程环境下;
  • ConcurrentHashMap是线程安全的,多线程环境下可用;
  • Hashtable是线程安全的,能用于多线程环境中;

2.继承的父类不同

  • HashMap继承自AbstractMap类。但二者都实现了Map接口。
  • Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。父类都被废弃,自然而然也没人用它的子类Hashtable了。

3.包含的contains方法不同

  • HashMap是没有contains方法的,而包括containsValue和containsKey方法;
  • hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法。

4.是否允许null值

  • Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;
  • HashTable键值对都不能为空,否则包空指针异常。

5.计算hash值方式不同

  • HashMap有个hash方法重新计算了key的hash值,因为hash冲突变高,所以通过一种方法重算hash值的方法:这里计算hash值,先调用hashCode方法计算出来一个hash值,再将hash与右移16位后相异或,从而得到新的hash值。
  • Hashtable通过计算key的hashCode()来得到hash值就为最终hash值。

6.解决hash冲突方式不同

  • HashMap中,当出现冲突时 链表+红黑树
  • HashTable中, 都是以链表方式存储。

ConcurrentHashMap

HashMap和ConcurrentHashMap和Hashtable的区别_第1张图片

ConcurrnetHashMap 由很多个 Segment 组合,而每一个 Segment 是一个类似于 HashMap 的结构,所以每一个 HashMap 的内部可以进行扩容。但是 Segment 的个数一旦初始化就不能改变,默认 Segment 的个数是 16 个,你也可以认为 ConcurrentHashMap 默认支持最多 16 个线程并发。

HashMap和ConcurrentHashMap和Hashtable的区别_第2张图片
可以发现 Java8 的 ConcurrentHashMap 相对于 Java7 来说变化比较大,不再是之前的 Segment 数组 + HashEntry 数组 + 链表,而是 Node 数组 + 链表 / 红黑树。当冲突链表达到一定长度时,链表会转换成红黑树。

你可能感兴趣的:(笔记,面试,哈希算法,java,散列表)