HashMap 与 Hashtable 区别

本文对比了Java中的HashMap和HashTable在线程安全、效率、Nullkey/Nullvalue支持、初始容量和哈希冲突处理等方面的差异,以及推荐在不同场景下的使用。同时提到了ConcurrentHashMap和JDK1.8后HashMap的变化。
摘要由CSDN通过智能技术生成
1 、线程安全: HashMap 是非线程安全的, HashTable 是线程安全的; HashTable 内部的方法基本都经过
synchronized 修 饰 。 如 果 要 保 证 线 程 安 全 的 话 就 建 议 使 用 ConcurrentHashMap , 也 可 以 通 过
Collections.synchronizedMap(hashmap) 方式将 hashmap 转换为线程安全的 map
2 、效率:因为线程安全的问题, HashMap 要比 HashTable 效率高一点。另外 HashTable 基本被淘汰,不要在
代码中使用它
3 、对 Null key Null value 的支持: HashMap null 可以作为键,这样的键只有一个,可以有一个或多个键
所对应的值为 null 。但是在 HashTable put 进的键值只要有一个 null ,直接抛 NullPointerException
4 、初始容量大小和每次扩充容量大小的不同 :
创建时如果不指定容量初始值, Hashtable 默认的初始大小为 11 ,之后每次扩充,容量变为原来的 2n+1
HashMap 默认的初始化大小为 16 。之后每次扩充,容量变为原来的 2 倍。
创建时如果给定了容量初始值,那么 Hashtable 会直接使用给定的大小,而 HashMap 会将其扩充为 2
的幂次方大小。也就是说 HashMap 总是使用 2 的幂作为哈希表的大小。
5 、底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认
8 )时,将链表转化为红黑树,以减少搜索时间。 Hashtable 没有这样的机制。
推荐使用:在 Hashtable 的类注释可以看到, Hashtable 是保留类不建议使用,推荐在单线程环境下使用
HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值