关于重写equals()与hashCode()

在HashMap与HashSet中,是不允许元素重复的。

在判定时比较元素的hashCode()是否相等,equals()是否返回true,那么问题来了

 

这是一个Person类

public class Person {
    private String id;
    private String name;
    private Integer age;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((age == null) ? 0 : age.hashCode());
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age == null) {
            if (other.age != null)
                return false;
        } else if (!age.equals(other.age))
            return false;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    /*@Override
    public int hashCode() {
        System.out.println("id = " + id + ";id.hashCode = " + id.hashCode());
        return id.hashCode();
    }
    @Override
    public boolean equals(Object obj) {
        System.out.println("equals");
        Person p = (Person)obj;
        if(this.id == p.id) {
            return true;
        }else{
            return false;
        }
    }*/
}

 

这是一个Test类

public class TestHashCode {
    public static void main(String[] args) {
        Set<Person> set = new HashSet<Person>();
        Person p1 = new Person();
        p1.setId("11");
        p1.setName("张三");
        p1.setAge(20);
        Person p2 = new Person();
        p2.setId("11");
        p2.setName("李四");
        p2.setAge(30);
        set.add(p1);
        set.add(p2);
        System.out.println(p1.hashCode() == p2.hashCode());
        System.out.println(p1.equals(p2));
        for (Person person : set) {
            System.out.println(person.toString());
        }
    }
}

 

如果Person的id属性作为主键,且只重写equals方法,我们认为id相等的两个对象为同一个对象

此时p1.equals(p2)返回true,但是hashCode()却不相等,而hashSet判断唯一的依据是hashCode()值相等且equals()返回true

所以我们的预期是p1和p2为同一个对象,但是hashSet认为他们是两个对象。

所以我们需要同时重写hashCode()和equals()方法。

转载于:https://www.cnblogs.com/cz305679760/p/4560137.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金算盘高手论坛资料中心_3D304期 菜鸟论坛精英PK专栏 速来围观!!

点上方“菜鸟选号论坛”→点右上角“...”→选“星标★”每日上午更新&#xff0c;星标置顶与大神不走散苹果是置顶&#xff0c;安卓是星标 点击"菜鸟选号论坛"关注我们论坛明星版块&#xff0c;集全网各路高手之大乘&#xff0c;打造草根明星 展示舞台。同时主要是为…

诸暨机器人餐厅价格_现场 | 一家尝出“锅气”的餐厅 探店机器人餐厅

观点地产网蔡澜先生的书中曾说过&#xff0c;“食在广东&#xff0c;其实是食在顺德”&#xff0c;顺德这座美食之都&#xff0c;满足了对食物异常挑剔的广东人的味蕾追求。最近&#xff0c;一家坐落“凤城”顺德的餐厅开业了。餐厅开业本身并没什么稀奇&#xff0c;不过这是一…

VelocityTracker简要

翻译自&#xff1a;http://developer.android.com/reference/android/view/VelocityTracker.html參照自&#xff1a; http://blog.jrj.com.cn/4586793646,5298605a.html android.view.VelocityTracker主要用跟踪触摸屏事件&#xff08;flinging事件和其它gestures手势事件&…

积木赛尔号机器人_赛尔号:谱尼三次败北,经历过被吊打、封印,一次比一次惨...

赛尔号&#xff1a;谱尼三次败北&#xff0c;经历过被吊打、封印&#xff0c;一次比一次惨。精灵类型的动漫层出不穷&#xff0c;在我们儿时看过精灵宝可梦、数码宝贝等等作品。国内的动漫则是有赛尔号和洛克王国&#xff0c;相较而言还是赛尔号更加的出名一些&#xff0c;更加…

xenu工具介绍

Xenu Link Sleuth 也许是你所见过的最小但功能最强大的检查网站死链接的软件了。你可以打开一个本地网页文件来检查它的链接&#xff0c;也可以输入任何网址来检查。它可以分别列出网站 的活链接以及死链接&#xff0c;连转向链接它都分析得一清二楚&#xff1b;支持多线程&…

安卓模拟器_exagear模拟器安卓模拟器

Exagear模拟器简介让Android 设备用户重温经典 PC 游戏&#xff0c;来自俄罗斯的初创公司 Eltechs发布了一款全新的 Android 游戏模拟器 ExaGear Strategies。该游戏模拟器的主要功能就是将经典的 PC 游戏带到 Android 智能手机或平板电脑上来。公告1.exagear软件和游戏&#x…

HBase 常用Shell命令

两个月前使用过hbase&#xff0c;现在最基本的命令都淡忘了&#xff0c;留一个备查~ 进入hbase shell console$HBASE_HOME/bin/hbase shell如果有kerberos认证&#xff0c;需要事先使用相应的keytab进行一下认证&#xff08;使用kinit命令&#xff09;&#xff0c;认证成功之后…

将Excle数据导入到数据库

假如Excel中的数据如下&#xff1a; 数据库建表如下&#xff1a; 其中Id为自增字段&#xff1a; 代码&#xff1a; 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Web;5 using System.Web.UI;6 using System.Web.UI.WebControls;7 us…

click vue 重复调用_VUE防止多次点击,重复请求

VUE防止多次点击&#xff0c;重复请求1.添加自定义文件 preventReClick.jsimport Vue from vueconst preventReClick Vue.directive(preventReClick, {inserted: function (el, binding) {el.addEventListener(click, () > {if (!el.disabled) {el.disabled truesetTimeou…

virbr0怎么关闭_CentOS 7中关闭删除virbr0虚拟网卡

在CentOS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡&#xff0c;这个是因为在虚拟化中有使用到libvirtd服务生成的&#xff0c;如果不需要可以关闭后去掉&#xff1a;[rootlocalhost ~]# virsh…

动态规划(五) 最大连续子序列和(Maximum Continuous Subsequence Sum)

占位...转载于:https://www.cnblogs.com/AloneAli/p/4580931.html

python中beautifulsoup是什么库_BeautifulSoup库详解(个人整理)

BeautifulSoup4是爬虫必学的技能。BeautifulSoup最主要的功能是从网页抓取数据&#xff0c;Beautiful Soup自动将输入文档转换为Unicode编码&#xff0c;输出文档转换为utf-8编码。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器&#xff0c;如果我们不…

iOS 设置系统音量和监听系统音量变化

很简单的调用 首先在工程引入MediaPlayer.framework #import <MediaPlayer/MediaPlayer.h> 1. 获取系统音量 // 获取系统音量 MPVolumeView *volumeView [[MPVolumeView alloc] init];UISlider *volumeViewSlider nil;for (UIView *view in [volumeView subviews]){if …

h5关于选择器以及class的小加强

1、querySelector和querySelectorAll 这两个方法类似于jquery的选择器 document.querySelector(.box) document.querySelectorAll(.box)前者只能选择一组中的第一个&#xff0c;后者选择一组元素。 2、getElementsByClassName document.getElementsByClassName(box) 选择的结…

1 睡眠唤醒_一劳永逸解决WIN10所有睡眠问题

1.初级阶段&#xff0c;解决因硬件的唤醒事件powercfg -lastwake查看上次唤醒电脑的设备哪些硬件能唤醒电脑&#xff1f;powercfg /devicequery wake_armed列出现在可以唤醒电脑的所有硬件设备&#xff0c;可以看到现在键盘能唤醒powercfg /devicequery wake_programmable列出全…

[转]Device Context 设备环境 设备上下文 理解

http://blog.csdn.net/p424671075/article/details/7235601转载于:https://www.cnblogs.com/qrlozte/p/4582594.html

生成路径 vs 设置_Simulink代码生成之模型配置

欢迎关注我的微信公众号【新能源动力电池与BMS】&#xff0c;头条号&#xff1a;【阿Q在江湖】&#xff1b;所有文章资料会在公众号首发。本文已同步录制视频讲解&#xff1a;Simulink代码生成之模型配置_视频教程 - 知乎。PS&#xff1a;前段时间&#xff0c;传出美国禁用一些…

常见电容器图片_各种电容器图片大集合

图1是胆&#xff1b;图2是灯具&#xff1b;图3是mkph电容&#xff1b;图4是met电容&#xff1b;图5、图10是pei电容&#xff1b;图6是胆贴片电容&#xff1b;图7是mpe电容&#xff1b;图8是贴片电容&#xff1b;图11是轴向电解电容器&#xff1b;图12是mpp电容。图1是ppn电容&a…

解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾

解析php混淆加密解密的手段&#xff0c;如 phpjm,phpdp神盾,php威盾 原文 解析php混淆加密解密的手段&#xff0c;如 phpjm,phpdp神盾,php威盾 php做为一门当下非常流行的web语言&#xff0c;常常看到有人求解密php文件&#xff0c;想当年的asp也是一样。一些人不理解为什么要混…

bootstrap 合并菜单_Bootstrap与tab组合,切换菜单实例

Test$(function () {$(#myTab a:last).tab(show);//初始化显示哪个tab$(#myTab a).click(function (e) {e.preventDefault();//阻止a链接的跳转行为$(this).tab(show);//显示当前选中的链接及关联的content})})HomeProfileMessagesSettings服务器.home....profile...messages..…