Hashmap基础知识笔记

前言背景
HashSet通过Hashmap来实现的,用来存储不重复数据的,怎么判断里面的对象是否重复呢?这时必须是重写了equals方法去比较对象的里面所有的值,而不是比较引用地址,比较引用地址它们永远都不相等,除非是同一个对象。通过equals比较的过程性能是非常不佳的,所以有了hashCode这个设计。
hashCode() 方法被设计在 Object 类中,说明是希望所有的对象都能实现该方法,该方法是会返回一个对应于当前对象的一个整数,之所以所有对象都实现该方法是为了将来对象在查找时变得快捷。

HashMap采用hash算法来决定Map中key的存储,并通过hash算法来增加集合的大小
hash表里可以存储元素的位置称为桶(bucket),如果通过key计算hash值发生冲突时,将采用链表的形式存储元素
在这里插入图片描述
HashMap的扩容操作是一项很耗时的任务,所以如果能估算map容量,最好先给它一个默认初始值,避免多次扩容
HashMap的线程是不安全的,多线程环境中推荐是ConcurrentHashMap

HashMap是基于hashing的原理,我们使用put(key,value)存储对象到HashMap中,使用get(key)从HashMap获取对象

当我们使用put方法存入时,它先调用key.hashCode()方法。提供hashCode的值,用于找到bucket位置,来存储Entry对象

Map提供了keySet()方法:方法返回值是Map中key值的集合
Map还提供了entrySet()方法:返回值是一个set集合,此集合类型为Map.Entry.

问题:如果两个key的hashcode值相同,你如何获取值对象?
答案:当我们调用get(key)方法,HashMap会使用key的hashcode值,找到bucket位置,然后获取值对象。

“如果有两个值对象,储存在同一个bucket ?”答案:将会遍历链表直到找到值对象。

“这时会问因为你并没有值对象去比较,你是如何确定确定找到值对象的?”答案:找到bucket位置之后,会调用keys.equals()方法,去找到链表中正确的节点,最终找到要找的值对象。

什么是hash值?
相同的HASH值的文件的内容肯定是完全相同(即使文件名不同). HASH值还有文件校验的功能,相当于文件的校验码.是通过hashcode计算来的

HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。

什么是hash冲突?
如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。

如何解决hash冲突?
链表

在hashset中添加一个数据:

  1. 先看hashCode()值是否相同

2.相同:继续走equals()方法

  1. 返回true: 说明元素重复,就不添加

  2. 返回false:说明元素不重复,就添加到集合

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你在狗叫什么、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值