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

在这里插入图片描述

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

在这里插入图片描述
可以发现 Java8 的 ConcurrentHashMap 相对于 Java7 来说变化比较大,不再是之前的 Segment 数组 + HashEntry 数组 + 链表,而是 Node 数组 + 链表 / 红黑树。当冲突链表达到一定长度时,链表会转换成红黑树。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值