HashTable, HashMap, ConcurrentHashMap 之间的区别

HashTable, HashMap, 和 ConcurrentHashMap 都是 Java 中用于存储键值对的集合类,它们之间有以下区别:

  1. HashTable:

    • 线程安全性:HashTable 是线程安全的,所有的方法都是同步的,即每个方法都会使用 synchronized 关键字来保证线程安全。
    • Null 键值:不允许使用 null 作为 key 或 value。如果试图存储 null 值或 key,则会抛出 NullPointerException
    • 遍历:Iterator 遍历 Hashtable 时,是安全的,不会抛出 ConcurrentModificationException。
  2. HashMap:

    • 线程安全性:HashMap 不是线程安全的,如果多个线程同时访问一个 HashMap 实例,而其中至少有一个线程修改了该 HashMap 的结构(增加或删除元素),那么必须保证外部同步。
    • Null 键值:允许使用 null 作为 key,这样的 key 只能有一个;允许多个 key 为 null 的 value。
    • 遍历:Iterator 遍历 HashMap 时,如果在迭代过程中修改了 HashMap 的结构,会抛出 ConcurrentModificationException。
  3. ConcurrentHashMap:

    • 线程安全性:ConcurrentHashMap 是线程安全的哈希表。它采用了一种不同于 Hashtable 和 synchronized HashMap 的锁分段技术(segmentation),不仅保证了对于大多数操作的线程安全性,而且支持并发读取,而不需要加锁。
    • Null 键值:不允许 null 作为 key 或 value。如果试图存储 null 值或 key,则会抛出 NullPointerException
    • 遍历:Iterator 遍历 ConcurrentHashMap 时,如果在迭代过程中修改了 ConcurrentHashMap 的结构,不会抛出 ConcurrentModificationException。但是迭代器可能不会显示插入的元素,而显示修改的元素。
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值