为什么要重写 hashcode 和 equals 方法?

简介: 为什么要重写 hashcode 和 equals 方法?

在项目中经常看到实体类中的set/get方法下都有这样一段代码:

public boolean equals(Object o){}
public int hashCode(){}

这个方法的作用是什么呢?


如果没有这些重写equals 和hashcode方法会怎么呢?


这个要从HashMap说起。在定义HashMap时如果key值为自定义对象,必须重写equals和hashCode方法。


直接看代码:

class cimTest_hashcode_equals {
  private Integer id;
  public Integer getId()
  {return id; }
  public cimTest_hashcode_equals(Integer id)
  {this.id = id;  }
//  故意先注释掉equals和hashCode方法
    public boolean equals(Object o) {
        if (o == null || !(o instanceof cimTest_hashcode_equals))
        { return false; }
        else
        { return this.getId().equals(((cimTest_hashcode_equals) o).getId());}
    }
//
    public int hashCode()
    { return id.hashCode(); }
}
public class WithoutHashCode {
  public static void main(String[] args) {
    cimTest_hashcode_equals k1 = new cimTest_hashcode_equals(1);
    cimTest_hashcode_equals k2 = new cimTest_hashcode_equals(1);
    HashMap<cimTest_hashcode_equals,String> hm = new HashMap<cimTest_hashcode_equals,String>();
    hm.put(k1, "Key with id is 1");
    System.out.println(hm.get(k2));
}
}

先说一下执行结果:

1、注释掉equals方法,System.out.println(hm.get(k1)); -> Key with id is 1

2、注释掉equals方法,System.out.println(hm.get(k2)); -> null


1 case code 结果 结论
2 注释掉equals和HashCode方法 System.out.println(hm.get(k2)) null
3        
4        
5        


目录
相关文章
|
6月前
|
存储 算法 Java
为什么要重写 hashcode 和 equals 方法
为什么要重写 hashcode 和 equals 方法
54 0
|
15天前
|
存储 算法 Java
为什么重写 equals 方法时必须同时重写 hashCode 方法?
本文探讨了 Java 中 `hashCode` 方法的作用及其与 `equals` 方法的关系,解释了为什么重写 `equals` 方法时必须同时重写 `hashCode` 方法,并提供了如何正确重写 `hashCode` 方法的示例。
|
11月前
|
存储
重写equals后为什么要重写hashcode方法
重写equals后为什么要重写hashcode方法
66 0
|
6月前
|
存储 Java
为什么要重写hashCode()和equals()(深入了解)
为什么要重写hashCode()和equals()(深入了解)
|
6月前
|
存储 IDE Java
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
45 1
|
存储
为什么重写 equals 方法就必须重写 hashCode 方法?
为什么重写 equals 方法就必须重写 hashCode 方法?
75 0
|
存储 Java
重写equals方法
我们在java程序中调用自带的equals方法时,你是否会有这样的疑问:明明我比较的数据都一样啊,为什么会返回false呢?有些人可能还会疑问,怎么有时候返回true?有时候返回false呢?这是为什么呢?其实是和Java底层人家写的equals方法逻辑有关系
|
存储 NoSQL
简单讲一下 HashCode() 与 equals()方法
简单讲一下 HashCode() 与 equals()方法.
109 0
|
Oracle Java 关系型数据库
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
首先我们有一个假设:任何两个 object 的 hashCode 都是不同的。 那么在这个条件下,有两个 object 是相等的,那如果不重写 hashCode(),算出来的哈希值都不一样,就会去到不同的 buckets 了,就迷失在茫茫人海中了,再也无法相认,就和 equals() 条件矛盾了,证毕。
150 0
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
|
存储 算法 Java
面试题系列第4篇:重写了equals方法,为什么还要重写hashCode方法?
面试题系列第4篇:重写了equals方法,为什么还要重写hashCode方法?
157 0
面试题系列第4篇:重写了equals方法,为什么还要重写hashCode方法?