關係操作符
關係操作符生產的是一個boolean(布爾)結果,它們計算的是操作數的值之間的關係。如果關係是真實的,關係表達式會生成true(真);如果關係不真實,則會生成false(假),關係操作符包括小於(<),大於(>),小於或等於(<=),大於或等於(>=),等於()以及不等於(!=),等於和不等於適用於所有的基本數據類型,而其他比較符不適用於boolean類型。因爲boolean值只能爲true或false,“大於”和“小於”沒有實際意義。
測試對象的等價性
關係操作符 == 和!=也適合用於所有對象,但是這倆個操作符通常會使第一次接觸Java的程序員感到迷惑。下面是一個例子:
//:operators/Equicalence.java
public class Equivalence {
public static void main(String[] args){
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
}
}/*Output:
false
true
*/
語句Systemout.println(n1 == n2)將打印出括號內的比較式的布爾值結果。讀者可能認爲輸出結果肯定先是true,再是false,因爲兩個Integer對象都是相同的。但是儘管對象的內容相同,然而對象的引用卻是不同的,而和!=比較的就是對象的引用。所以輸出結果實際上顯示false,再是true。這自然會使第一次接觸關係操作符的人感到驚奇。
如果想比較兩個對象的實際內容是否相同,又該如何操作呢?此時,必須使用所有對象都適用的特殊方法equals()。但這個方法不適用於“基本類型”,基本類型直接使用和!=即可。下面舉例說明如何使用:
//:operators/EqualsMethod.java
public class EqualsMethod{
public static void main(String[] args){
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));
}
}/*Output:
true
*/
結果正如我們所預料的那樣。但事情並不總是這麼簡單!假設你創建了自己的類,就像下面這樣:
//:operators/EqualsMethod.java
//Default equals() does not compare contents.
Class Value {
int i;
}
public class EqualsMethod2{
public static void main(String[] args){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
}/*Output:
false
*/
事情再次變得令人費解了:結果又是false!這是由於equals()的默認行爲是比較引用。所以除非在自己的新類中覆蓋equals()方法,否則不可能表現出我們希望的行爲。