文章目录
- 一、前言
- 二、hashCode()方法
- 三、equals()方法
- 四、hashCode() 与 equals()
-
- 4.1 不会创建“类对应的散列表”,不存在重写equals()要重写hashCode()
- 4.2 会创建“类对应的散列表”:重写equals()一定要重写hashCode()
-
- 4.2.1 自定义类作为HashSet的泛型,自定义类重写equals()不重写hashCode(),equals()的return true的范围比hashCode() return 哈希值范围大,导致HashSet中中出现重复元素
- 4.2.2 自定义类作为HashSet的泛型,自定义类重写equals()并重写hashCode(),hashCode() return 哈希值范围比equals() return true范围大,造成哈希冲突
- 4.2.3 equals()和hashCode()完全对应,和默认相同
- 4.2.4 HashSet源码解析:进一步解释为什么重写equals()就要重写hashCode()?
- 五、一个好的重写hashCode()的目标
- 六、面试金手指
- 七、尾声
一、前言
如果面试官问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?
遇到这样的问题,应该怎样回答呢?其实,equals和hashCode都是Object对象中的非final方法,它们设计的目的就是被用来覆盖(override)的,所以在程序设计中还是经常需要处理这两个方法。下面我们一起来看一下,它们到底有什么区别,总结一波!
二、hashCode()方法
hashCode() 方法:
- 作用:用于判断两个对象是否相等;
- 实现:通过获取到的哈希码来确定该对象在哈希表中的索引位置(tip:HashMap中使用hash作为indexFor的输入),哈希码也称散列码,实际上就是返回一个int整数;
- Object类:hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数,并且通过调用hashCode()方法获取对象的hash值。
举个例子
public class DemoTest {
public static void main(String