Hashcode 散列码

简介: 一个类A没有重写hashCode()方法,那么它使用Object的hashCode()方法生成散列码,即用对象的内存地址计算散列码。 所有有“Hash”字样的类都涉及到hashcode,如HashMap,HashSet。所以要使用这些容器存储对象,必须同时重写hashCode() 和equals()。否则一个类的两个对象objA 与objB,满足objA.equals(objB)为真,放

一个类A没有重写hashCode()方法,那么它使用Object的hashCode()方法生成散列码,即用对象的内存地址计算散列码

所有有“Hash”字样的类都涉及到hashcode,如HashMap,HashSet。所以要使用这些容器存储对象,必须同时重写hashCode() 和equals()。否则一个类的两个对象objA 与objB,满足objA.equals(objB)为真,放到HashSet<>容器中是不会自动去重的。

微笑问:如何编写hashCode()?

答:equals(Object obj)方法中用于比较的字段,都应该参与hashCode()的计算。也就是说,一个类的两个对象objA 与objB,若objA.equals(objB)为真,则objA.hashCode()==objB.hashCode()也应该为真。


注意hashCode的可变性。

HashMap在内部使用哈希表实现了对键的对应值的快速查找。但是这里也有一个小问题:支持哈希码的键依赖于可变字段的内容,这样容易产生 bug,即使最耐心的 Java 开发人员也会被这些 bug 逼疯。

下例中的 Person 对象有一个常见的 hashCode() ,它使用 firstName、lastName 和 age 字段 ( 所有字段都不是 final 字段 )计算 hashCode(),对 Map 的 get() 调用会失败并返回 null。


目录
相关文章
|
4月前
|
存储 自然语言处理 算法
Object.hashCode() 详解
在Java编程中,hashCode方法是一个常见而重要的概念。它通常用于哈希表、集合以及一些需要高效检索数据的数据结构中。然而,对于许多开发者来说,hashCode方法可能是一个容易被忽略或者被简单实现的部分。在本文中,我们将深入探讨Java中hashCode的一些思考,以便更好地理解其背后的原理和影响。
156 1
Object.hashCode() 详解
|
2月前
|
Java 容器
equals与hashcode的区别与联系
equals与hashcode的区别与联系
|
4月前
|
存储 Java 对象存储
当hashCode相同时,equals是否也相同?
当hashCode相同时,equals是否也相同?
28 0
|
4月前
|
存储 Java
为什么要重写hashCode()和equals()(深入了解)
为什么要重写hashCode()和equals()(深入了解)
|
存储 NoSQL
简单讲一下 HashCode() 与 equals()方法
简单讲一下 HashCode() 与 equals()方法.
104 0
|
存储 Java 索引
都2022年了,不会还有人hashCode方法都讲解不清楚吧
都2022年了,不会还有人hashCode方法都讲解不清楚吧
hashCode和equals的区别
hashCode和equals的区别
314 0
|
存储 缓存 算法
关于 equals 和 hashCode,看这一篇真的够了!
这几天在尝试手撸一个类似Lombok的注解式代码生成工具,用过Lombok的小伙伴知道,Lombok可以通过注解自动帮我们生产equals()和hashCode()方法,因此我也想实现这个功能,但是随着工作的深入,我发现其实自己对于equals()和hashCode()的理解,也处在一个很低级的阶段。
关于 equals 和 hashCode,看这一篇真的够了!
|
存储 算法 Java
equals 和 hashCode 到底有什么联系?
写在前面 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,都可以被重写(overwrite)。
equals 和 hashCode 到底有什么联系?
|
Java 索引
hashCode和equals的区别(一)
Hello,大家好,我是子悠,作为本周的小编我已经不想跟大家介绍自己了,这篇文章让我们跟随 Jay Pan( 哇,一位新作者哦)的步伐学习知识吧。下面是正文。 有面试官会问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?equals和hashCode都是Object对象中的非final方法,它们设计的目的就是被用来覆盖(override)的,所以在程序设计中还是经常需要处理这两个方法。下面我们一起来看一下,它们到底有什么区别,总结一波!