equals方法的源码解析

 阅读jdk API我们知道Object class在java.lang包下。Object class是Object结构的跟。

  jdk1.8 API在线地址 :https://blog.fondme.cn/apidoc/jdk-1.8-baidu/

 Object class中的方法有

                                      hashCode(),equals(),clone(),notify(),notifyAll(),wait(),finalize()

package java.lang;

 
public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
    public final native Class<?> getClass();
    public native int hashCode();
    public boolean equals(Object obj) {
        return (this == obj);
    }
    protected native Object clone() throws CloneNotSupportedException;   
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    public final native void notify();
    public final native void notifyAll();
    public final native void wait(long timeout) throws InterruptedException;
    public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                               "nanosecond timeout value out of range");
        }
        if (nanos > 0) {
            timeout++;
        }
        wait(timeout);
    }
    public final void wait() throws InterruptedException {
        wait(0);
    }
    protected void finalize() throws Throwable { }
}

 1.首先看equals()方法。

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

 equals方法是用来比较其他对象是否等于此对象。

 equals方法在非空对象引用上实现等价关系:

 自反性:对于任何的非空的参考值x, x.equals(x) 应该返回true。

对称性:对于任何非空引用值x和y,x.equals(y)应该返回true,当且仅当y.equals(x)返回true。

传递性:对于任何非空引用值x,y,z 。x.equlas(y)返回true,y.equals (z)返回true。然后x.equals(z)应该返回true。

一致性:对于任何非空引用值x,y。多次调用x.equals (y) 始终返回true或false。在不修改x和y 的值的情况下一直成立。

对于任何非空参考值x,x.equals(null) 始终返回false。

equals类方法Object实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空的参考值xy ,当且仅当xy引用相同的对象( x == y具有值true )时,该方法返回true

请注意,无论何时覆盖该方法,通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。

2. equals方法比较字符串是否相等时。

 private final char value[];
public boolean equals(Object anObject) { if (this == anObject) { return true; }
//判断是否是String类型的实例 if (anObject instanceof String) { String anotherString = (String)anObject; //强转为String类型 int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }

 3.equals判断对象是否相等时;

重写equals和hashCode方法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; //判断内存地址是否相同 相同返回true
        if (!(o instanceof UserInfo)) return false;//判断被比较的对象与此对象是否是同一类型的,不同类型返回false

        UserInfo userInfo = (UserInfo) o;//强制类型转换 将被比较类型转换为此类型
//分别比较两对象的属性值时候相同 只要存在一个属性值不相同返回false  全部相同返回true
        if (!getUserid().equals(userInfo.getUserid())) return false;
        if (!getUname().equals(userInfo.getUname())) return false;
        return getUage().equals(userInfo.getUage());
    }

    @Override
    public int hashCode() {
        int result = getUserid().hashCode();
        result = 31 * result + getUname().hashCode();
        result = 31 * result + getUage().hashCode();
        return result;
    }

 

posted @ 2019-08-17 10:33  春眠不觉笑  阅读(1251)  评论(0编辑  收藏  举报