码迷,mamicode.com
首页 > 其他好文 > 详细

判断Set里的元素是否重复、==、equals、hashCode方法研究-代码演示

时间:2015-04-13 12:15:28      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:


 

     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);
    }

输出如下:

false
true
true
且set中元素的个数是2.

 

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

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

调用了hashcode方法方法之后就去调用了equals方法,所以set的元素重复性是根据equals来判断的。

 

下面尝试不重写hashcode方法:

输出:

false
true
false
且set中元素的个数是4

 

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

输出:

false
false
false
且set中元素的个数是4

作者:欧初权

转载注明:http://www.cnblogs.com/langtianya/p/4421582.html

判断Set里的元素是否重复、==、equals、hashCode方法研究-代码演示

标签:

原文地址:http://www.cnblogs.com/langtianya/p/4421582.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!