• 判断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);
        }

    输出如下:

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

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

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

    下面尝试不重写hashcode方法,即默认使用Object的hashcode方法(代码省略):

    输出:

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

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

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

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

    下面尝试不重写hashcode和equals方法(代码省略):

    输出:

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

    证明如果不重写hashcode方法,无论equals是返回true还是返回false都没有用,因为在调用equals方法之前会先调用hashcode方法,在调用hashcode方法的时候

    就已经被认为这些对象全部是不重复的元素,直接往set中添加这些对象,并完成添加,equals方法就没有机会调用到。

    作者:欧初权

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

  • 相关阅读:
    从头学Android之Android布局管理:LinerLayout线性布局
    Android onTouch事件传递机制
    android开源项目和框架
    <hdu
    <hdu
    <poj
    <poj
    <hdu
    <hdu
    <hdu
  • 原文地址:https://www.cnblogs.com/langtianya/p/4421582.html
Copyright © 2020-2023  润新知