關系運算符生成的是一個“布爾”(Boolean)結果。它們評價的是運算對象值之間的關系。若關系是真實的,關系表達式會生成true(真);若關系不真實,則生成false(假)。關系運算符包括小於(<)、大於(>)、小於或等於(<=)、大於或等於(>=)、等於(==)以及不等於(!=)。等於和不等於適用於所有內建的數據類型,但其他比較不適用於boolean類型。
1. 檢查對象是否相等
關系運算符==和!=也適用於所有對象,但它們的含義通常會使初涉Java領域的人找不到北。下面是一個例子:
//: Equivalence.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); } } ///:~
其中,表達式System.out.println(n1 == n2)可打印出內部的布爾比較結果。一般人都會認為輸出結果肯定先是true,再是false,因為兩個Integer對象都是相同的。但盡管對象的內容相同,句柄卻是不同的,而==和!=比較的正好就是對象句柄。所以輸出結果實際上先是false,再是true。這自然會使第一次接觸的人感到驚奇。
若想對比兩個對象的實際內容是否相同,又該如何操作呢?此時,必須使用所有對象都適用的特殊方法equals()。但這個方法不適用於“主類型”,那些類型直接使用==和!=即可。下面舉例說明如何使用:
//: 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)); } } ///:~
正如我們預計的那樣,此時得到的結果是true。但事情並未到此結束!假設您創建了自己的類,就象下面這樣:
//: EqualsMethod2.java 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)); } } ///:~
此時的結果又變回了false!這是由於equals()的默認行為是比較句柄。所以除非在自己的新類中改變了equals(),否則不可能表現出我們希望的行為。不幸的是,要到第7章才會學習如何改變行為。但要注意equals()的這種行為方式同時或許能夠避免一些“災難”性的事件。
大多數Java類庫都實現了equals(),所以它實際比較的是對象的內容,而非它們的句柄。