帮你搞懂Java中重写equals方法为什么要重写hashcode方法?

话不多说,直接上例子,包你懂

首先我们只重新equals()方法

public class Student {

    private String name;
    private  int age;
    private  String QQ;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name) &&
                Objects.equals(QQ, student.QQ);
    }

看我们的测试类

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        Student student2 = new Student();
        System.out.println(student.equals(student2));
        System.out.println(student.hashCode());
        System.out.println(student2.hashCode());
        HashMap<Student, String> map = new HashMap<>();
        map.put(student,"123");
        map.put(student2,"456");
        System.out.println(map.get(student));
        System.out.println(map.get(student2));

    }
}

依次输出

true                               
356573597             student 的hashcode值
1735600054            student 2的hashcode值
123                         
456

是否出现矛盾???
用equals比较说明对象相同,但是在HashMap中却以不同的对象存储(没有重写hascode值,两个hascode值,在他看来就是两个对象)。
到底这两个对象相等不相等????
说明必须重写hashCode()的重要性,

接下来重写重写equals方法和hashCode方法,再比较

public class Student {

    private String name;
    private  int age;
    private  String QQ;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name) &&
                Objects.equals(QQ, student.QQ);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age, QQ);
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        Student student2 = new Student();
        System.out.println(student.equals(student2));
        System.out.println(student.hashCode());
        System.out.println(student2.hashCode());
        HashMap<Student, String> map = new HashMap<>();
        map.put(student,"123");
        map.put(student2,"456");
        System.out.println(map.get(student));
        System.out.println(map.get(student2));

    }
}

依次输出

true
29791           //相同的对象
29791
456			  //说明以一个值key存储,相同的值
456

看到这里,同学 你懂了吗? 还不懂,可以自己实现一遍代码。

全部评论

相关推荐

如题,鼠鼠快碎掉了。鼠鼠正在投暑期和日常的实习,可能是因为简历太差吧,好多初筛都没有过,所以其实格外珍惜每一次的约面。尤其鼠鼠是八股选手,但凡碰到喜欢问项目的面试官是直接速通鼠掉。那是一个万里无云的晚上,鼠鼠接到tx某子公司的约面,虽然没算法题但是问得我汗流浃背,面试官从我的八股批判到我的项目继而批判到我的实习,感觉基本上除了八股这种特定答案之外每一个问题都要质问我,尤其是询问到实习的时候我解释完之后直接来了一句“那你实习也啥也没做啊”,鼠鼠直接原地碎掉。之后的问题鼠鼠也不太记得了,大部分都是直接吟诵咒语,肌肉记忆直接不过脑子。因为接二连三的压力鼠鼠直接摆烂了,回答的时候也不太看屏幕直接开始搓...
机器人为什么是猫呀:楼主要自信。好的面试官是会照顾面试者情绪的,不会直接说那么伤人的话。面试表现其实很看自己的心态跟情绪,这些又和面试官的反馈很相关。而且有些面试官很高傲,不求甚解,自认为你的东西看一眼很简单,就不会听你说了,却没有从一个没有丰富工作经验的人的角度去思考。楼主不要因为这些影响心态,不要怀疑自己,只要遇到一个“合适”的面试官就会好很多的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务