为什么要同时重写equals和hashcode方法

废话不多说,先上案例,如下

先定义一个User类,并定义2个属性,构造方法,new 2个对象,user1 user2

    public static void main(String[] args) {
        User user1 = new User(1,"张三");
        User user2 = new User(1,"张三");
        System.out.println(user1.hashCode());
        System.out.println(user2.hashCode());
        System.out.println(user1.equals(user2));
        Set<User> set = new HashSet<User>();
        set.add(user1);
        set.add(user2);
        System.out.println(set);
    }

运行程序,输出结果如下:

重写 hashcode 和 equals 重新运行,结果如下:

2张运行结果可以看出hashcode 值相等,且 equals 返回 true HashSet 起到去重效果

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (age != user.age) return false;
        return name.equals(user.name);
    }

    @Override
    public int hashCode() {
        int result = age;
        result = 31 * result + name.hashCode();
        return result;
    }

以下是关于hashcode的一些规定:

两个对象相等,hashcode一定相等,两个对象不等,hashcode不一定不等;

hashcode相等,两个对象不一定相等,hashcode不等,两个对象一定不等;

以下是Object源码中hashcode 和 equals的具体实现

public native int hashCode();

public boolean equals(Object obj) {
        return (this == obj);
    }

不重写 hashcode 和 equals 的情况,默认使用Object内中的 equals 和hashcode方法

默认情况下Object 为不同对象生成的 hashcode 一般是不同的,默认equals 方法比较的是2个对象的内存地址,所以比较结果为false

我们只重新hashcode方法,不重新equals 方法,运行程序结果如下:

虽然hashcode值相同,但是比较的任然是内存地址,然而2个对象的内存地址是不一样的,所以比较结果任然是false,只有同时重新hashcode 和equals 才能判读2个对象是否相等,才能达到去重效果;

注意:==比较的是内存地址, equals比较的是值是否相等

原文地址:https://www.cnblogs.com/zhanh247/p/12662576.html

时间: 2024-10-03 18:17:25

为什么要同时重写equals和hashcode方法的相关文章

为什么要重写equals和hashcode方法

equals hashcode 当新建一个java类时,需要重写equals和hashcode方法,大家都知道!但是,为什么要重写呢? 需要保证对象调用equals方法为true时,hashcode必须相同. 先看下面的例子: 没有重写equals和hashcode方法User类 public class User { private Integer age; private String name; public User() { } public User(Integer age, Stri

【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址

Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等.特别指出利用equals比较八大包装对象(如int,float等)和String类(因为该

重写equals和hashCode方法的示例

如果一个类有自己特有的"逻辑相等",且需要以此进行比较时,那么就需要重写equals方法. 在Object的规范中,重写equals方法有下面几条通用约定: 自反性. x.equals(x) == true 对称性.if   y.equals(x) == true , then  x.equals(y) == true 传递性.if   x.equals(y) == true y.equals(x) == true , then x.equals(z) == true 一致性.如果比较

重写equals() 和 hashCode()方法

去重操作时, 有时候往Set集合存放对象User,我们User类的字段太多时,比如有50个字段, 判断两个User对象相同,不需要判断它们所有字段都相同,只需要判断它们的某几个字段相同,就定为它们俩重复, 这时候需要重写Equals()方法和HashCode()方法, public class User { private String name; private int age; private String passport; //getters and setters, construct

关于重写equals和hashCode

什么时候需要重写equals和hashCode方法 在比较两个对象的内容的时候,需要重写这两个方法.java系统本身提供的(==)比较方法,有两种情况: 1.比较的是基本类型数据,则此时== 跟equals的效果一致,此时比较的是2个值的大小.例如 2.比较的是对象的引用,则此时==跟equals比较的是2个引用的内存地址是否一致. 这里插入一些对象和对象的引用这个知识点, Student stu=new Student("学生A");  语句1 有人会说,stu就是Student类的

如何编写出高质量的 equals 和 hashcode 方法?

什么是 equals 和 hashcode 方法? 这要从 Object 类开始说起,我们知道 Object 类是 Java 的超类,每个类都直接或者间接的继承了 Object 类,在 Object 中提供了 8 个基本的方法,equals 方法和 hashcode 方法就是其中的两个. equals 方法:Object 类中的 equals 方法用于检测一个对象是否等于另一个对象,在 Object 类中,这个方法将判断两个对象是否具有相同的引用,如果两个对象具有相同的引用,它们一定是相等的.

学习笔记-JAVA-考点10-什么情况下需要重写equals和hashcode()两个方法?

一.什么情况下需要重写equals和hashcode()两个方法? 1.加入到hashset中的自定义类的对象,为确保他们不重复,需要对他们的类重写equals()和hashcode()的方法. 如果不重写equals,相同内容不同引用的对象会被当做不同的对象被加入到hashset中. 重写equals()的示例代码: public boolean equals(Object obj){//这里不可以写成自定义类型自定义类型引用,这样集 <span style="white-space:p

Java中的equals和hashCode方法

本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法. equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复.这里我们首先要明白一个问题: equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的h