HashMap和HashTable

HashMap数据结构

这里写图片描述
hashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当某条链表的长度大于8时,就会将其转换为红黑树。遍历一条链表的时间复杂度O(n),当一条链表过长时,遍历这条链表可能会花很长时间,而遍历一颗红黑树的时间复杂度为O(logn),从而减少了插入或查找的时间。

般情况是通过【hash(key)%len】获得,也就是元素的key的哈希值对数组长度取模得到。默认hashmap数组长度为16.
比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。

HashMap和HashTable区别

1.继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2.线程安全性不同
Hashtable是线程安全,效率相对较低。
3.存储key和value是否支持null
HashMap是允许key或value为null,HashTable是不能使用null作为key和value。由于hashmap中的Key只能唯一,所以当key= null,只能存在一次,而value=null可以很多。
4.两个遍历方式的内部实现上不同
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
5.hash值不同
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

扩容

HashMap内存储数据的Entry数组默认是16,如果没有对Entry扩容机制的话,当存储的数据一多,Entry内部的链表会很长,这就失去了HashMap的存储意义了。所以HasnMap内部有自己的扩容机制。
1. 变量size,它记录HashMap的底层数组中已用槽的数量;
2. 变量threshold,它是HashMap的阈值,用于判断是否需要调整HashMap的容量(threshold = 容量*加载因子)
3. 变量DEFAULT_LOAD_FACTOR = 0.75f,默认加载因子为0.75
4. HashMap扩容的条件是:当size大于threshold时,对HashMap进行扩容

总结:HashMap的实现原理:

1.利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
2.存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中
3.获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
4.解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值