JAVA程式設計習慣之equals對比

d303577562發表於2020-10-30

養成良好的程式設計習慣,我們的程式碼質量才能越來越好。
objectA.equals(objectB)方法在Object類中是直接對比的記憶體地址是否相等,Long、Double、Integer等包裝類和String類都重寫了equals方法,會去對比雙方的值,而不是記憶體地址。
首先ojectA肯定是不能為空的,否則會出現空指標異常。我們來看下String.equals(Object obj)和Integer.equals(Object obj)兩個方法的原始碼:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        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;
}
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

我們可以看到,重寫的equals方法在對比值的之前都會先判定傳入的objectB物件是否屬於objectA物件所屬的類。在String.equals(Object objectB)方法中就會判定objectB是否是String類的物件。如果objectB是null,自然就不是String類的物件,也就不會執行下面的程式碼塊,也就不會空指標。
因此,如果是一個String常量和一個物件做比較。
例如:String s1 = “1” 、String s2,對比s1和s2的值。
直接呼叫s1的equals方法,不用去判定s2是否為空。

public boolean test1(String s2) {
	return "1".equals(s2);
}

如果是基本資料型別的常量和包裝類物件作對比,那直接使用==就可以了,也無需空判定。

public boolean test2(Integer i) {
	return 1 == i;
}

如果是兩個物件作對比,也只需要判定第一個物件是否是空.

public boolean test2(String s1, String s2) {
	if(s1 != s2 && s1 != null) {
		return s1.equals(s2);
	}
	return true;
}

相關文章