HashMap 和 HashTable

本文对比了HashTable与HashMap之间的核心不同之处,指出HashTable是同步的而HashMap不是,并介绍了如何将HashMap转换为同步版本的方法。此外,文章还提到了在多线程环境下这两种数据结构可能存在的线程安全问题,并给出了ConcurrentHashMap作为解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=medium]
[b]区别[/b]
[list]
[*]HashTable 与 HashMap 的区别主要在于 HashTable 是同步的,而 HashMap 不是同步的。
[*]HashTable 在 get(), put(), remove() 等方法都加上了 synchronized 关键字进行同步。这样的效率确实不高。
[*]HashMap 如果想使用同步版的,可以使用 Collections.synchronizedMap(new HashMap()) 来获取同步版。具体实现也就是添加了一个 Object,然后调用 get(), put() 等方法时都先锁定这个 Object。
[/list]
[b]误区[/b]
[list]
[*]同步的不代表是线程安全的,比如下面的代码。由于这个事务是由多个操作组成的,如果一个线程在执行完判断 containKey 后另外一个线程已经插入了数据,这时再执行就要杯具了。
[/list]
[/size]

public void operate() {
if (!map.containKey("something")) {
map.put("key", "value");
}
}

[size=medium]
不过如果是 ConcurrentHashMap 针对这种情况作了处理,它的父接口 ConcurrentMap 提供了一个 putIfAbsent 方法,这个方法也是原子操作的。
[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值