一、基础篇--1.2Java集合-HashMap和HashTable的区别

本文详细对比了Java中HashMap和HashTable的区别,包括继承类、null支持、线程安全性、遍历方式、初始容量及扩容策略、hash计算方法等,解析两者在设计上的侧重点及应用场景。

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

一、基础篇--1.2Java集合-HashMap和HashTable的区别

HashMap和HashTable的区别

1.继承的父类不同,HashMap继承的是AbstractMap类,HashTable继承的是Dictionary类,不过都实现了Map、Clone、Serializable三个接口。其中Dictionary类中注释说是一个被废弃的类,建议实现Map接口,如下图:

 * NOTE: This class is obsolete.  New implementations should

 * implement the Map interface, rather than extending this class.

2.HashTable key和value都不支持null,会抛出空指针异常;HashMap中key可以为null,这样的键只有这一个。

3.线程安全不同,HashMap线程不安全,HashTable线程安全,但是性能低下不推荐。

4.遍历方式有区别,HashMap用的是fail-fast迭代器。

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

之所以会有这样的不同,是因为Hashtable和HashMap设计时的侧重点不同。Hashtable的侧重点是哈希的结果更加均匀,使得哈希冲突减少。当哈希表的大小为素数时,简单的取模哈希的结果会更加均匀。而HashMap则更加关注hash的计算效率问题。在取模计算时,如果模数是2的幂,那么我们可以直接使用位运算来得到结果,效率要大大高于做除法。HashMap为了加快hash的速度,将哈希表的大小固定为了2的幂。当然这引入了哈希分布不均匀的问题,所以HashMap为解决这问题,又对hash算法做了一些改动。这从而导致了Hashtable和HashMap的计算hash值的方法不同 。

6.计算hash值的方法不同

HashTable直接使用对象的HashCode,HashMap为了解决冲突比较多,计算HashCode后又进行了一些运算数据

https://blog.youkuaiyun.com/wangxing233/article/details/79452946

posted @ 2019-02-18 15:24 ForeverYoungCoder 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值