當前位置:才華齋>計算機>java語言>

關於基於Java字串==與 equals

java語言 閱讀(5.28K)

雖然關於Java字串“==”和“equals”的問題是Java學習中的最基礎的一個問題,但是仍然有不少剛剛學習Java的同學搞不清楚裡面的原理,最近和朋友討論到這個問題,所以寫篇文章給大家分享一下我自己的理解。

關於基於Java字串==與 equals

首先讓我們看一個例子:

複製程式碼 程式碼如下:

public class TestStringEquals {

public static void main(String[] args) {

String a = "test";

String b = "test";

String c = new String("test");

String d = new String("test");

String e = a;

String f = new String(a);

String g = a + "";

tln(a == b ? "expression "a==b" is true"

: "expression "a==b" is false");

tln(a == c ? "expression "a==c" is true"

: "expression "a==c" is false");

tln(c == d ? "expression "c==d" is true"

: "expression "c==d" is false");

tln(a == e ? "expression "a==e" is true"

: "expression "a==e" is false");

tln(a == f ? "expression "a==f" is true"

: "expression "a==f" is false");

tln(a == g ? "expression "a==g" is true"

: "expression "a==g" is false");

if (ls(b) && ls(c) && ls(d) && ls(e)

&& ls(f) && ls(g)) {

tln("a equals b equals c equals d equals e equals f equals g");

}

}

}

如果先不答案,大家試著去做一做,能否保證全部正確呢?

下面公佈一下答案:

複製程式碼 程式碼如下:

expression "a==b" is true

expression "a==c" is false

expression "c==d" is false

expression "a==e" is true

expression "a==f" is false

expression "a==g" is false

a equals b equals c equals d equals e equals f equals g

要很好的理解這種題目,最好的辦法就是深入理解Java中String的“==”方法和“equals”方法的機制和原理。“equals”想必大家都知道,就是比較字串的內容,由於以上程式中的所有字串內容都是“test”,所以用equals比較它們都會相等。

但是你是否知道Java中基類Obejct的equals方法跟“==”方法其實是一致的呢?只不過是String類繼承Object類(Java中所有的類都是繼承Object類的)後,過載了equal的方法,使得其成為了比較字串中的內容。

很好的理解了equals之後,現在讓我們來研究一下“==”方法的'撲朔迷離。

“==”是Java中的運算子,它比較的內容是兩個物件的指標,也就是實際物件的地址。因此很容易理解e==a是返回true的。

我們再來看下c和d之間的比較,看到new關鍵詞,說明c和d都是重新申請了一塊記憶體地址,然後裡面賦值為“test”,所以c==d返回的是false。同理都可以理解

a,c,d,f之間的“==”操作都返回的是false。

然後再來看看g= a + “”,雖然沒有看到new關鍵詞,但是由於String類“+”操作符被過載之後,過載的方法之中一定會重新new一個String,所以也就變成了上面的情況。那麼最難理解的就是a和b的比較了,其實這是Java編譯器的優化所帶來的結果,java編譯器有一個叫字串常量池的儲存區域,由於String a = "test"這條語句編譯之後,“test”就會儲存在這個字串常量池中,那麼再定義b的時候,b仍然指向這塊區域,所以說a和b指向的仍然是同一塊區域。所以a==b返回的true。