Java两个对象的HashCode相等但这两个对象不一定相同------hash算法

Java两个对象的HashCode相等但这两个对象不一定相同------hash算法


hash算法是一种思想,例如最简单的哈希函数:求余运算。
例如有不同的整数通过对指定数(如2)的求余运算得到余数就那么几个。不同的整数可可以得到相同的余数即hash值

HashCode就是将对象的内存地址转化为整数后进行hash运算后得到的hash值。
所以两个对象的HashCode相同但内存地址不一定相同。

HashMap的底层也是这样实现的。数组加链表(如下图),当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。
在这里插入图片描述
HashMap中解决碰撞的方法

根据key的hashcode得到存储位置bucket(桶),有可能不同的key得到的位置一样这样就出现了hash碰撞。这样就引入了每一个bucket中的一个链表结构来解决碰撞,hashMap如果发生hash碰撞则将键值对象存在链表的下一个节点。

hashMap底层数据结构到底是怎样的

hashMap包含一个bucket数组和每一个bucket对应的链表结构,每一个K-V对象存放在这个链表中,这个链表结构主要用来解决hash碰撞后键值对象存储问题。

equals()和hashCode()的应用,以及它们在HashMap中的重要性

当两个不同的键对象的hashcode一样,他们会存储在同一个bucket位置的链表中,通过遍历这个链表再根据键对象的equals方法用来找到存放在链表中的键值对(Entry)对象。get方法用到equals和hashcode方法,put则用到hashcode方法。

不可变对象的好处

用不可变对象作为key,是非常合适的。

1)如果存放时key对象的hashcode和获取时这个key对象的hashcode不一致时则无法获取值对象。

2)不可变对象是线程安全的,减少碰撞的几率。

https://mp.weixin.qq.com/s?src=11&timestamp=1604618063&ver=2689&signature=dgJV3qTFiCFx-CU-MEFROLZaDta89k8jz1rILMrc2NCXicDcE2GoyJYrbIDH6JUFf-CzBxC7CF1UelrgqJZMlBarSAB0fOSdhLeBIiQVP0ty9kZ402PnRJCv3HLGy7&new=1

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,比较两个对象属性值是否相等的最优算法取决于对象的类型和属性数量。假设比较的对象类型是自定义的类,那么可以通过实现 `equals` 方法和 `hashCode` 方法来比较对象属性值是否相等,这是 Java 中推荐的做法。 在实现 `equals` 方法时,通常需要比较对象的每一个属性值是否相等,如果所有属性值都相等,则返回 `true`,否则返回 `false`。在比较每一个属性值时,可以使用 Java 提供的 `Objects.equals(Object a, Object b)` 方法,该方法可以比较两个对象是否相等,避免了空指针异常。 同时,还需要实现 `hashCode` 方法来保证对象在放入 HashMap 或 HashSet 等容器时能够正确地存储和查找。 示例代码如下: ```java public class Person { private String name; private int age; // 省略构造方法和其他方法 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); } } ``` 在上述代码中,`equals` 方法比较了两个 `Person` 对象的 `name` 和 `age` 属性值是否相等,使用了 `Objects.equals` 方法进行比较,同时还重写了 `hashCode` 方法,使用了 `Objects.hash` 方法生成哈希值。 如果比较的对象类型是 Java 自带的类,如 `String`、`Integer` 等,通常可以直接使用 `equals` 方法进行比较,因为这些类已经实现了 `equals` 方法。但需要注意的是,如果使用 `==` 操作符比较两个对象,比较的是对象的引用,而不是对象属性值的相等性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值