一、問題引入
Java測試兩個變量是否相等有兩種方式:==運算符和equals方法。
但是這二者完全一樣嗎?考慮下面程序:
1 public class TestEqual 2 { 3 public static void main(String[] args) 4 { 5 int it = 65; 6 float f1 = 65.0F; 7 System.out.輸出:
65和65.0是否相等? true65和'A'是否相等? truestr1和str2是否相等? falsestr1和是equals str2? true
由程序結果可以看出:
- 使用==來判斷2個基本類型的的變量(不要求這兩個變量類型一樣,但二者都必須是基本類型),則只要兩個變量字面值相等,使用==判斷就會返回true,5-9行代碼及其輸出說明了這個問題
- 對于引用類型變量,必須兩個變量指向同一個對象時,==才會返回ture,否則false,11-13行代碼及其輸出說明了這個問題
對于代碼13行的判斷,顯然“不是很合理”,因為直覺上,二者就是一樣的啊,這就是我們經常遇到的判斷兩個引用變量是否相等時,并不嚴格要求兩個引用變量指向同一個對象,如上面程序中的兩個字符串變量,只要二者引用的字符串對象里包含的字符序列相同即可認為相等,此時就需要用到equals方法,上述代碼最后一行就是如此,結果返回true.
二、再看equals
equals方法是Object類提供的一個實例方法,因此所有引用變量都可調用該方法來判斷與其他引用變量是否相等。
真相是殘酷的:其實在判斷兩個引用變量(不是基本類型的變量哦,其實equals是不能夠用來判斷基本類型變量的)是否相等的時候,equals方法與==是一樣的,即只有兩個引用變量指向同一個對象時才會返回true. 這……上面的情況怎么解釋?
眾所周知,所有類都是Object類的子類,所以所有子類都可以重載父類的方法,其實String重寫了父類Object類中的equals方法,自己整了一個標準:只要兩個字符串包含的字符序列相同就返回true,否則false.( 學了C++的孩子可能會說,我重載==運算符,不重載equals方法,不可以嗎,遺憾的是Java是沒有運算符重載的)。
很容易看出來,因為Object類提供的equals方法本質上與==一樣,這就導致,這個方法沒有太大的實際意義,若果像==運算符那樣嚴格的標準比較引用變量,估計實際中很少有兩個引用變量會相等,所以這個方法(如果需要的話)常常在我們建立一個類時,就會重寫該方法,自己定義一套合理的相等判斷標準即可。
新聞熱點
疑難解答