hash表及HashCode方法解析

1、hash

hash是一个函数,通过一系列的算法来得到一个hash值,hash表中的地址值。hash表就是所有的hash值组成的,有很多种hash函数,也就代表着有很多种算法得到hash值,如上面截图的三种。hash函数就是根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表。

2、hash表

也叫散列表,一种散列存储结构,通过hashcode直接确定对象在hash表中的地址

3、hashcode

    HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的。hash是直接计算出存储位置,比遍历快。
    hashcode就是通过hash函数得来的一个值,通俗的说,就是通过某一种算法得到的,hashcode就是在hash表中有对应的位置。每个对象都有对应自己的hashcode,通过对象的内部地址(也就是物理地址)转换成一个整数,然后该整数通过hash函数的算法就得到了hashcode,所以,hashcode是什么呢?就是在hash表中对应的位置。这里如果还不是很清楚的话,举个例子,hash表中有 hashcode为1、hashcode为2、(...)3、4、5、6、7、8这样八个位置,有一个对象A,A的物理地址转换为一个整数17(这是假如),就通过直接取余算法,17%8=1,那么A的hashcode就为1,且A就在hash表中1的位置。

4、hashcode和equals

  先通过hashcode来比较,如果hashcode相等,那么就用equals方法来比较两个对象是否相等,用个例子说明:上面说的hash表中的8个位置,就好比8个桶,每个桶里能装很多的对象,对象A通过hash函数算法得到将它放到1号桶中,当然肯定有别的对象也会放到1号桶中,如果对象B也通过算法分到了1号桶,那么它如何识别桶中其他对象是否和它一样呢,这时候就需要equals方法来进行筛选了。

 1、如果两个对象equals相等,那么这两个对象的HashCode一定也相同

 2、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置

重写equals的方法的时候,建议也重写hashcode方法

5、hash冲突

不管hash函数设计的如何巧妙,总会有特殊的key导致hash冲突,特别是对动态查找表来说

①开放定址法:
                         当一个关键字和另一个关键字发生冲突时,使用某种探测技术在Hash表中形成一个探测序列,然后沿着这个探
                         测序列依次查找下去,当碰到一个空的单元时,则插入其中
②链地址法:
                      产生hash冲突后在存储数据后面加一个指针,指向后面冲突的数据(hashmap)
③公共溢出区法:
                        建立一个特殊存储空间,专门存放冲突的数据。此种方法适用于数据和冲突较少的情况。
④再散列法:
                       准备若干个hash函数,如果使用第一个hash函数发生了冲突,就使用第二个hash函数,第二个也冲突········

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值