如何保证哈希值的唯一性

如何保证哈希值的唯一性

1.哈希表(散列表)概述

hashCode()最终返回的是一个int 值

哈希表结构:

对象数组+链表

存储原理:

哈希表在存储的时候会调用对象的hashCode值,拿到返回的int值,然后去跟默认数组的长度进行取余运算,得到一个具体的下标,这个下标用来决定这个对象究竟存到什么位置。

优点:

这样做的好处是根本不需要对数组进行遍历,通过哈希值取余运算就能很快找到数据存储的位置。

当取余得到的数据一样时,链表会依次往下存储,当哈希桶中的数据量大于8时,从链表转化为红黑二叉树,会更利于查找。当哈希桶中的数据减少到6时,又会从红黑树转化为链表。

补充:(面试题勿踩坑!!!)

问题:

已知我的链表哈希桶里现在有7个数据,它一定会从红黑树转为链表吗?

解答:

这个题的坑在于已知有7个数据,但是他并没有告诉你这时候是已经转成了红黑树,所以得一分为二的看待。

如果是一开始存数据,那么现在本身就还是链表,不存在再次转为链表的问题。

如果是已经转为了红黑树,现在数据减少到7,那么当数据减少到6的时候一定会转化为链表。

Java中的哈希表:

初始桶数量 : 16

散列因子 : 0.75 (哈希桶的数量是会变化的,当桶中已经有75%的地方存有数据了,那么对桶进行扩容,桶就会变得更多。扩容大小默认为原长度的两倍)

二、解决方法

1.必须重写hashCode()方法

解释:

每new一个对象就会有一个新的地址值,哈希码值几乎都不相等,那么在放进哈希桶中重复的几率就特别低。

比如:
new Person(“张三”,23); 0x123
new Person(“张三”,23); 0x124
虽然两个对象的值一样,但是,它们两个的地址不一样,所以哈希码值不一样,会放在不同的哈希桶中,不会去重。

作用:

1.只有重写了hashCode()方法才能调用equals()方法,因为子类不重写就继承父类,而父类(Object类)就是依据你的地址值进行计算的,但是每new一个对象就会有一个新的地址值,地址值不一样,得到的哈希码值一定不重复,所以一定不会调用equals()方法。因为只有出现同一个索引,才会使用equals()方法去对比。

2.尽可能少调用equals()方法 如果对象的属性值一样,那么尽可能让他们的哈希码值也一样,那么一定会调用equals()方法,这样就会去重了。
使用系统默认的hashCode()方法,减少equals()方法调用次数,提高效率。

2.必须重写equals()方法

解释:

equals()用来对比你的属性是否相同。当哈希值相同时调用equals()方法对比属性,如果属性相同,则认为是同一个对象,会去重。

注意:这两个方法只重写其中一个不去重,必须同时重写!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值