为什么重写 equals 方法 必须重写 hashCode

  自己学到这,就记录了下来,代码都是自己敲得,有不对的地方希望大神指点出来

  如果你重写了equals,比如说是基于对象的内容实现的,而不重写 HashCode,那么很可能某两个对象明明是“相等”,而hashCode却不一样.那么就会返回 false。例如在 HashSet 集合中,不允许存在相同元素,但是当你 new 两个对象,对象内容相同时,在 HashSet 集合中就存在了相同的两个元素,如何解决这个问题?那就要重写 equals 方法,但是重写 equals 方法还不能解决问题,因为在 HashSet 中判断两个元素是否相等是首先判断 hashCode 内存地址是否相等,如果不等在用 equals 方法判断内容是否相等,由于 new 了两个对象,虽然内容相同,但是在内存中开辟两两块地址,hashCode 肯定不同,所以还要重写 hashCode 方法。

下面是代码说明

public class Person {

//随便定义个类

  private int id;

  private String name;

  private int age;

  //set get 方法

  public int getId() {

    return id;

  }

  public void setId(int id) {

    this.id = id;

  }

  public String getName() {

    return name;

  }

  public void setName(String name) {

    this.name = name;

  }

   public int getAge() {

    return age;

  }

  public void setAge(int age) {

    this.age = age;

  }

  //构造方法

  public Person(int id,String name, int age) {

    this.id=id;

    this.name = name;

    this.age = age;

  }

  //重写 hashCode 方法

  public int hashCode() {

    return this.getId();

  }

  //重写 equals 方法

  public boolean equals(Object obj) {

    if(this==obj){

      return true;

    }

    if(obj instanceof Person){

      if(this.getId()==((Person) obj).getId()){

        return true;

      }

    }

    return false;

  }

}

  测试类中代码

  //实例化

  Person p1 = new Person(1,"张三",12);

  Person p2 = new Person(1,"张三",12);

  // 声明 HashSet 集合类

  HashSet<Person> h = new HashSet<Person>();

  //添加数据

  h.add(p1);

  h.add(p2);

  //遍历集合

  for(Person per :h){

    System.out.println(per.getName());

  }

不重写 equals 和 hashCode 方法的执行结果

只重写 equals 方法的执行结果

重写 equals 和 hashCode 方法的执行结果

时间: 2024-10-11 12:29:52

为什么重写 equals 方法 必须重写 hashCode的相关文章

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

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样 对于值对象,==比较的是两个对象的值 对于引用对象,比较的是两个对象的地址 默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equ

为什么系列之重写equals方法必须重写hasCode方法?

Object源代码及注释 equals是Object的公有方法,那么我们通常都会在自己的类中重写这个equals方法,同时必须重写hasCode方法,知道为什么重写equals方法必须重写hasCode方法呢? /** * Returns a hash code value for the object. This method is * supported for the benefit of hash tables such as those provided by * {@link jav

为什么重写equals方法必须重写hashCode?

如果两个对象调用equals返回相等,那么这两个对象调用hashCode方法必须返回相同的整数.如果不重写hashCode,会违反该原则.这个原则主要针对的是映射操作(map接口). 注意: 1. String重写了Object的equals,现在比较的是两个String所包含的char sequence是否相等. String s1 = new String("hello"); String s2 = new String("hello"); s1.equals(

java中为什么重写equals时必须重写hashCode方法?

在上一篇博文Java中equals和==的区别中介绍了Object类的equals方法,并且也介绍了我们可在重写equals方法,本章我们来说一下为什么重写equals方法的时候也要重写hashCode方法. 先让我们来看看Object类源码 /** * Returns a hash code value for the object. This method is * supported for the benefit of hash tables such as those provided

java重写equals方法(重点讲解)

为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往需要重写equals()方法. 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法. 怎样重写equals()方法? 重写equals方法的要求: 1.自反性:对于任何非空引用x,x.equals(x)应该返回tru

重写equals方法需要注意的几点

为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往需要重写equals()方法. 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法. 怎样重写equals()方法? 重写equals方法的要求:1.自反性:对于任何非空引用x,x.equals(x)应该返回true

java重写equals方法需要注意的几点

为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往需要重写equals()方法. 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法. 怎样重写equals()方法? 重写equals方法的要求:1.自反性:对于任何非空引用x,x.equals(x)应该返回true

equals方法的重写

一.为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往需要重写equals()方法. 我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法. 二.怎样重写equals()方法? 重写equals方法的要求:1.自反性:对于任何非空引用x,x.equals(x)应该返回

【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明

在项目开发中,我们都有这样的经历,就是在新增表时,会相应的增加java类,在java类中都存在常见的几个方法,包括:equals(),hashcode(),toString() ,compareto()这四个方法,对于刚刚接触java的初学者来说,对于这块可以没有更深入的了解,只是单纯意义上的复制粘贴,并没有很好的去了解.现在借用这个时间给大家说说这几个方法作用. equals: 比较两个对象相等时使用(需要配合Hashcode一起使用,在后边再进行详细解释)   hashcode: 重写has