• Java中ConcurrentHashMap 和 Hashtable


    Java中ConcurrentHashMap 和 Hashtable

    ConcurrentHashMapHashtable 都是用于在Java中实现线程安全的哈希表数据结构的类,但它们有很多区别。以下是关于 ConcurrentHashMapHashtable 的区别、优缺点以及示例说明:

    区别

    1. 线程安全性

      • ConcurrentHashMap 是Java Collections Framework的一部分,它使用分段锁(Segmented Locking)来实现高度的线程安全性。不同的段(Segment)可以独立锁定,允许多个线程同时访问不同的段,提高并发性能。
      • Hashtable 使用单一锁来保护整个数据结构,这意味着在多线程环境中只能有一个线程访问该数据结构,性能较差。
    2. 允许空键和值

      • ConcurrentHashMap 允许空键和空值,即可以存储null。
      • Hashtable 不允许存储null键或值,任何尝试存储null的操作都会引发NullPointerException
    3. 迭代器支持

      • ConcurrentHashMap 支持并发迭代器,即可以在迭代时同时进行插入和删除操作而不会抛出ConcurrentModificationException
      • Hashtable 的迭代器不支持并发操作,如果在迭代过程中进行修改操作,会抛出ConcurrentModificationException
    4. 性能

      • ConcurrentHashMap 在高并发环境中通常具有更好的性能,因为它使用了更细粒度的锁。
      • Hashtable 在高并发环境下性能较差,因为它使用了单一锁。

    优缺点

    ConcurrentHashMap 的优点

    • 高并发性:ConcurrentHashMap 的分段锁机制允许多个线程同时访问不同的段,提高了并发性能。
    • 允许存储null:可以存储null键和null值,增加了灵活性。
    • 支持并发迭代器:支持安全的并发迭代。

    ConcurrentHashMap 的缺点

    • 内存消耗:分段锁机制会增加内存开销。
    • 较复杂:相对于 Hashtable 较复杂,使用时需要注意不同的锁段。

    Hashtable 的优点

    • 简单:相对较简单,易于使用。
    • 传统:在较早的Java版本中使用广泛。

    Hashtable 的缺点

    • 性能问题:性能较差,特别在高并发环境中。
    • 限制:不允许存储null键或值,不支持并发迭代。

    示例代码

    下面是一个简单的示例,展示了如何使用 ConcurrentHashMapHashtable

    使用 ConcurrentHashMap

    import java.util.concurrent.ConcurrentHashMap;
    
    public class ConcurrentHashMapExample {
        public static void main(String[] args) {
            ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
            
            map.put(1, "One");
            map.put(2, "Two");
            map.put(3, "Three");
            
            // 允许存储null键和值
            map.put(null, "NullValue");
            map.put(4, null);
            
            System.out.println(map.get(2));  // 输出: Two
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    使用 Hashtable

    import java.util.Hashtable;
    
    public class HashtableExample {
        public static void main(String[] args) {
            Hashtable<Integer, String> table = new Hashtable<>();
            
            table.put(1, "One");
            table.put(2, "Two");
            table.put(3, "Three");
            
            // 不允许存储null键或值
            // table.put(null, "NullValue"); // 会抛出 NullPointerException
            // table.put(4, null); // 会抛出 NullPointerException
            
            System.out.println(table.get(2));  // 输出: Two
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在上述示例中,ConcurrentHashMap 允许存储null键和值,并支持并发访问,而 Hashtable 不允许存储null,并且在多线程环境中性能可能较差。

  • 相关阅读:
    vue3的自定义指令
    程序员团队如何做好项目管理?十年管理经验,真实案例分享
    学生党蓝牙耳机性价比排行榜,好评榜TOP5机型推荐
    千脑智能理论会是未来指引智能机器设计的理论基石吗?
    Vue 2.0——v-once使用讲解
    电脑重装系统word从第二页开始有页眉页脚如何设置
    下载配置 maven并在 idea 上应用
    ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)
    redis分布式锁
    7-8 HashSet存入自定义类对象
  • 原文地址:https://blog.csdn.net/sanmansan/article/details/133693091