直观方式理解重写hashcode的必要性

首先简单了解一下hash结构的代表人物--hashmap

数据结构:

简单来说,hashmap的存储结构是一个存放多个链表的数组,但是在jdk8之后由链表转换为红黑树,无论是链表还是红黑树,都是为了解决hash冲突的问题,由于本文章目的是针对重写hashcode方法进行解释,因此不对hashmap的底层数据结构做过多描述

工作过程:

例:map.put(key,value)方法执行过程

首先调用key的hashcode方法计算出它的哈希码,然后以这个哈希码作为索引,使用哈希函数来确定在数组中的存储位置。如果没有值,就将键值对存入,如果已经有值,这就是产生了哈希冲突,则使用链表或者红黑树来解决这个哈希冲突

同样的,执行get方法也是先根据hashcode方法计算出哈希码,通过哈希函数确定存储位置,然后在这个位置进行查询最后得到目标键值对

文字输出可能不太直白,下面附上一张简单的示例图片

结论:

当我们存储自定义的数据时,Java会默认使用hashcode计算哈希码,使用hashmap或者hashset存储数据时,要根据计算出的哈希码来确定数据在集合中的位置,如果不重写hashcode方法,将这些数据作为key存储的时候,无法计算出哈希码,那么就会被错误的插入到不确定的位置,同时获取数据的时候,由于没有正确的hashcode方法来计算哈希码,哈希表也就无法正确的定位到数据的存储位置

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值