HashMap与HashTable的区别

HashMap与HashTable都是Java中的哈希表实现,但它们在线程安全、效率和对null值的支持上存在差异。HashMap非线程安全但效率更高,适合单线程环境;HashTable则是线程安全的,但可能导致效率降低。HashMap允许null键和值,而HashTable不允许。此外,HashMap在高负载时会转换为红黑树,提高查找效率,HashTable则无此机制。推荐在多线程环境下使用ConcurrentHashMap替代HashTable。

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

Hash与HashTable的区别

线程安全

HashMap是非线程安全的,HashTable内部方法基本都经过了synchronized修饰,所以HashTable是线程安全的

效率

因为线程安全的问题,HashMap要比HashTable的效率高一点儿

对Null key和Null value的支持

HashMap中,null可以作为键,这样的键只有一个,可以有一个或多个值为null

HashTable不允许有null的键或值,如果put进的键值只要有一个为null,则抛出空指针异常

初始容量大小与每次扩容大小的不同

  1. 创建时如果不指定容量初始值,HashTable默认的初始大小为11,之后每次扩充,容量变为之前的2n+1,HashMap默认初始化大小为16。之后每次扩充,容量变为原来的2倍
  2. 创建时如果给定了容量初始值,那么HashTable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小,也就是说HashMap总是使用2的幂次方作为哈希表的大小

底层数据结构

jdk1.8后HashMap解决哈希冲突有了较大的变化,当链表长度大于阈值(默认8)时,将链表转化为红黑树,以减少搜索时间,HashTable没有这样的机制

推荐使用

在HashTable的注释中可以看到,HashTable是保留类不建议使用,推荐在单线程环境下使用HashMap,如果需要在多线程环境下使用则用ConcurrentHashMap替代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Black_Me_Bo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值