美文网首页java技术栈进阶
Interview之一:hashCode 与equals

Interview之一:hashCode 与equals

作者: 进击的小鹿 | 来源:发表于2018-01-22 18:12 被阅读7次

    1、hashCode 与 equals

    Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,

    equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复。

    equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
    直白点说就是,equals()方法不相等的两个对象,hashCode()有可能相等。

    hashCode()是native方法:Returns a hash code value for the object.

    public native int hashCode();
    

    对于hashCode,我们应该遵循如下规则:

    1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。

    2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。

    3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。

    public boolean equals(Object obj) {
        return (this == obj);
    }
    

    对于equals,我们必须遵循如下规则:

    对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。

    反射性:x.equals(x)必须返回是“true”。

    类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。

    一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。

    任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

    注意:

    **当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 **

    附上 AbstractSet类 的 equals()与 hashCode()方法

    public boolean equals(Object o) {
        if (o == this)    //同一个对象
            return true;  
    
        if (!(o instanceof Set))  //不是Set
            return false;
        Collection<?> c = (Collection<?>) o;
        if (c.size() != size())    //size不一致
            return false;
        try {
            return containsAll(c);
        } catch (ClassCastException unused)   {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }
    }
    
    
    
    public boolean containsAll(Collection<?> c) {
        for (Object e : c)
            if (!contains(e))
                return false;
        return true;
    }
     
    
    public boolean contains(Object o) {
        Iterator<E> it = iterator();
        if (o==null) {
            while (it.hasNext())
                if (it.next()==null)
                    return true;
        } else {
            while (it.hasNext())
                if (o.equals(it.next()))
                    return true;
        }
        return false;
    }
    
    public int hashCode() {   //hashCode求和
        int h = 0;
        Iterator<E> i = iterator();
        while (i.hasNext()) {
            E obj = i.next();
            if (obj != null)
                h += obj.hashCode();
        }
        return h;
    }
    

    相关文章

      网友评论

        本文标题:Interview之一:hashCode 与equals

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