为什么要重写 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        


目录
相关文章
|
30天前
|
存储 算法 Java
为什么要重写 hashcode 和 equals 方法
为什么要重写 hashcode 和 equals 方法
22 0
|
4月前
|
存储
重写equals后为什么要重写hashcode方法
重写equals后为什么要重写hashcode方法
44 0
|
1月前
|
存储 Java
为什么要重写hashCode()和equals()(深入了解)
为什么要重写hashCode()和equals()(深入了解)
|
1月前
|
自然语言处理 算法 Java
为什么说重写equals时要重写hashcode
为什么说重写equals时要重写hashcode
|
3月前
|
存储 IDE Java
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
17 1
|
8月前
|
存储
为什么重写 equals 方法就必须重写 hashCode 方法?
为什么重写 equals 方法就必须重写 hashCode 方法?
60 0
|
9月前
|
存储 Java
重写equals方法
我们在java程序中调用自带的equals方法时,你是否会有这样的疑问:明明我比较的数据都一样啊,为什么会返回false呢?有些人可能还会疑问,怎么有时候返回true?有时候返回false呢?这是为什么呢?其实是和Java底层人家写的equals方法逻辑有关系
|
存储 NoSQL
简单讲一下 HashCode() 与 equals()方法
简单讲一下 HashCode() 与 equals()方法.
86 0
|
Oracle Java 关系型数据库
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
首先我们有一个假设:任何两个 object 的 hashCode 都是不同的。 那么在这个条件下,有两个 object 是相等的,那如果不重写 hashCode(),算出来的哈希值都不一样,就会去到不同的 buckets 了,就迷失在茫茫人海中了,再也无法相认,就和 equals() 条件矛盾了,证毕。
119 0
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
|
存储 算法 搜索推荐
面试题:重写equals方法为什么通常会重写hashcode方法?
面试题:重写equals方法为什么通常会重写hashcode方法?
139 0