打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
判断Set里的元素是否重复、==、equals、hashCode方法研究-代码演示
     SiteBean site1 = new SiteBean("http://www.yjbys.com/", "");        SiteBean site2 = new SiteBean("http://www.yjbys.com/", "");        Set<SiteBean> aaSet = new HashSet<>();        aaSet.add(site1);        aaSet.add(site2);        System.out.println(site1 == site2);        System.out.println(site1.equals(site2));        System.out.println(site1.hashCode() == site2.hashCode());        SiteBean site3 = new SiteBean("http://www.yjby1s.com/11", "");        SiteBean site4 = new SiteBean("http://www.yjby1s.com/11", "");        aaSet.add(site3);        aaSet.add(site4);
SiteBean 重写了hashCode和equals方法,代码如下: //比较的是域名    @Override    public int hashCode() {        return siteUrl.hashCode();    }    //比较的是域名    @Override    public boolean equals(Object obj) {        if (obj == null) {            return false;        }        if (getClass() != obj.getClass()) {            return false;        }        final SiteBean siteBean = (SiteBean) obj;        return Objects.equals(siteUrl, siteBean.siteUrl);    }

输出如下:

falsetruetrue
且set中元素的个数是2.

 

set内部实现实际是map,在处理map的key的时候调用了hashcode方法,set中代码如下

 static final int hash(Object key) {        int h;        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);    }

 

下面尝试不重写hashcode方法:

输出:

falsetruefalse
且set中元素的个数是4

    调试证明:把元素往set中添加时,首先会对比hashcode是否相等,如果hashcode不相等就直接往set中加这个元素,如果hashcode相等就对比equals方法,如果equals不相等就往set中加这个元素,所以set的元素重复性是根据hashcode和equals方法来判断的,

    对于为什么覆盖equals方法就一定要覆盖hashcode方法的原因也显示了出来:由于是先调用hashcode方法的,如果不覆盖hashcode方法,默认会去取内存的物理地址,那么两个不同的对象的hashcode必然不同的,于是直接结束添加了,根本没法调用到equals方法,就不用说equals内部实现如何了,不关你equals是返回true还是false都没机会调用到了。

    由于set内部是用map实现的,所以往map中put元素的时候是一样的原理。

下面尝试不重写hashcode和equals方法:

输出:

falsefalsefalse
且set中元素的个数是4
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
HashSet 与TreeSet和LinkedHashSet的区别
Java集合总结:Set集合
Java中Set的深入研究 - javaGrowing - BlogJava
equals和HashCode深入理解以及Hash算法原理
java中set接口使用方法详解
Java中Set的深入研究
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服