HashMap HashSet 原理详解 与 对比

参考链接:
HashSet与HashMap的区别
深入Java集合学习系列:HashMap的实现原理
Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
Java HashSet的实现原理详解

Hashmap

1.原理

数组链接结构,put原理:首先计算key的hash值,找到table数组中的位置,找到table[i]位置后,这个链表找是否有这个key值,使用equal()方法进行比较,有这个key值,那么进行更改value操作,没有这个key,那么那么就将新的键值对添加到链表的后面,完成put操作(备注:put操作最后会有modcount的值进行++,这是为了防止多线程时候出错,遍历的时候,使用迭代器,expectedModCount的值不一样,说明发生线程不安全的现象,这时候里面执行快速失败fast-fail机制)
get()原理 get是通过key计算出hashcode然后利用hashcode找到数组的下标,然后进入table[i]链表中,通过equal()方法比较key的值,如果找到则返回value
resize()原理 当当前的map的键值对的数目等于负载因子乘以容量 也就是说达到了阈值,那么进行数组的容量乘以2的操作。然后原map中的键值对重新计算每个key对应的hashcode值,然后对新的数组的长度进行取模,找到在扩容后的数组下标,将键值对插入进去。

2.参数

HashMap是通过”拉链法”实现的哈希表。它包括几个重要的成员变量:table, size, threshold, loadFactor, modCount。
  table是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的”key-value键值对”都是存储在Entry数组中的。
  size是HashMap的大小,它是HashMap保存的键值对的数量。
  threshold是HashMap的阈值,用于判断是否需要调整HashMap的容量。threshold的值=”容量*加载因子”,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。
  loadFactor就是加载因子。
  modCount是用来实现fail-fast机制的。

HashSet

hashSet就是基于hashmap实现的,比如说hashset的add方法,它的add方法比如进来一个类(类的对象要不可变)的对象,那么其实底层就是hashmap的key是这个对象,通过计算这个对象的hashcode值,找到数组的位置,然后通过equals进行比较,如果比较没有,那么就add成功,如果比较成功,说明这个key有了,也就是说set集合中有这个对象了、不再添加。
其它的函数都是这样的,基于hashmap

Hashset与hashMap对比

HashSet与HashMap的区别

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值