基础面试题——HashMap和Hashtable和ConcurrentHashMap的区别

HashMap 不是线程安全的。多个线程同时对 HashMap 进行修改操作时可能会导致数据不一致问题
适合在单线程环境中使用,或在多线程环境中通过外部同步措施(如 Collections.synchronizedMap() 或手动加锁)来保证线程安全。
在单线程环境下性能最高,因为没有额外的同步开销。插入、删除和查找的平均时间复杂度为 O(1)

Hashtable 是线程安全的,所有方法都使用 synchronized 关键字进行了同步。
由于采用的是对整个 Hashtable 的方法级同步,因此在高并发情况下性能较差,可能出现大量线程竞争导致的性能瓶颈。
由于每个操作都需要获取锁,因此在多线程环境中性能较差,尤其是在大量线程争用同一个锁时。

ConcurrentHashMap 是为高并发设计的线程安全集合。它使用了一种更加细粒度的锁机制,允许多个线程同时读写不同的部分,而不会发生冲突。
在多线程环境中性能较好,它的锁分离机制允许多个线程并发访问不同部分,从而减少锁竞争。

数据结构
HashMap: 基于数组和链表(或红黑树)的混合结构。当发生哈希碰撞时,链表长度超过一定阈值后转化为红黑树,以提高查找效率。
Hashtable: 底层实现与 HashMap 类似,也使用数组和链表的结构,但由于 Hashtable 是早期的类,没有红黑树的优化。
ConcurrentHashMap: ConcurrentHashMap 的实现与 HashMap 类似,也采用了数组和链表/红黑树的结构,但使用 CAS 操作和锁分离机制来保证并发性能。

null 值和扩容
HashMap:允许 null 键和 null 值。它可以存储一个 null 键和多个 null 值。扩容时为原来的2倍
Hashtable:不允许 null 键或 null 值。如果试图在 Hashtable 中存储 null 键或 null 值,会抛出 NullPointerException。扩容时为原来的2倍+1
ConcurrentHashMap:不允许 null 键或 null 值,原因是 null 的存在可能会导致并发问题,例如无法区分返回值是因为键不存在还是键对应的值为 null。扩容时为原来的2倍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值