美文网首页
hashCode 和equals 代码研读

hashCode 和equals 代码研读

作者: 追逺 | 来源:发表于2018-06-15 17:07 被阅读0次

AbstractSet 抽象类代码研读
参考 https://www.cnblogs.com/magics/p/3633722.html

  public int hashCode() {
        int h = 0;
        Iterator<E> i = iterator();
        while (i.hasNext()) {
            E obj = i.next();
            if (obj != null)
                h += obj.hashCode();
        }
        return h;
    }

hashCode 集合遍历对象拿到hashCode,在相加

 public boolean equals(Object o) {
        if (o == this)
            return true;

        if (!(o instanceof Set))
            return false;
        Collection<?> c = (Collection<?>) o;
        if (c.size() != size())
            return false;
        try {
            return containsAll(c);
        } catch (ClassCastException unused)   {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }
    }

equals 方法只判断了同一个对象就返回true,从源代码可以看出来,存储自定义对象,并保证元素唯一性,必须重写hashCode 和equals 的方法

        HashSet<Person> set =new HashSet<Person>();
        set.add(new Person("张三",1));
        set.add(new Person("张三",1));
        set.add(new Person("李四",2));
        set.add(new Person("李四",2));
        for(Person person: set){
            System.out.println("name="+person.getName()+",age="+person.getAge());
        }

打印结果张三出现2次,李四出现2次
重写PersonhashCode 和eques的方法

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime*result+age;
        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(!(obj instanceof Person))
            return false;
        Person other = (Person) obj;
        if(age != other.age)
            return false;
        if(name == null){
            if(other.name != null)
                return false;
        }else if(!name.equals(other.name))
            return false;
        
        return true;
    }

相关文章

网友评论

      本文标题:hashCode 和equals 代码研读

      本文链接:https://www.haomeiwen.com/subject/gnppeftx.html