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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM