1. 程式人生 > >Java中關係操作符“==”和equals()方法的區別

Java中關係操作符“==”和equals()方法的區別

開發十年,就只剩下這套架構體系了! >>>   

一、前言

如果問你Java中==和equals()有何區別,相信你的第一反應會回答:==比較的是它們所指向的物件地址,而equals()方法比較的是它們的內容值。實際上,這樣的回答是不全面的。

二、關係操作符“==”

摘自《Java程式設計思想》一書中的原話:

關係操作符“==”生成的是一個boolean結果,它們計算的是運算元的值之間的關係。

 那麼關於==的比較,無外乎以下兩種情況。

  • 基本資料型別:它們的比較就是判斷值是否相同。
  • 引用資料型別:它們的比較就是判斷是否是同一個物件的引用,即其引用變數所指向的物件的地址是否相同。

、equals()方法

我們知道,Java中所有的類都是由Object類派生出來的,在Object類中定義定義了equals()方法,其原始碼如下:

public boolean equals(Object obj) {
        return (this == obj);
    }

也就是說,在沒有被重寫的情況下,比較的是引用型別的變數所指向的物件的地址

那麼,有哪些常用的類equals()方法被重寫了?比如String類、包裝類、Date類都是。

String類equals()方法原始碼:

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

包裝類,比如Integer中equals()方法原始碼:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

這些被重寫的equals()方法的類,比較的是引用型別的變數所指向的物件儲存的內容是否相等,即比較