簡體   English   中英

Java中==和.equals之間的區別。

[英]Difference between == and .equals in Java.

我知道這已被覆蓋,但我在SO上看到了不一致的論點。

所以,如果我有:

String a = "apple2e";
String b = "apple2e";

System.out.println("a==b? " + a == b);

搞錯了

據我了解,這是因為ab是對同一個對象的兩個不同引用( apple2e )。

所以我會有類似的東西:

a (reference_id 123) ------
                           ---------  "apple2e"
b (reference_id 456) ------

現在,如果我只想比較兩個字符串的內容 ,我會使用a.equals(b)

這是否意味着如果兩個引用指向同一個對象,JVM只是返回? 那么它不是真的在進行逐字符比較嗎?

謝謝

編輯

拿着電話。 感謝delnan指出+優先!!!

當我將其更改為:

System.out.println(a == b);

我的確是true

這更有意義。

編輯2

我簡直不敢相信。 大聲笑

我在做:

"a==b? " + a == b

這轉化為

"a==b? apple2e" == "apple2e"

難怪這是假的!!

據我了解,這是因為a和b是對同一個對象的兩個不同引用(apple2e)。

由於字符串實習,並且因為字符串內部ab是對同一String對象的不同引用。


不幸的是,您的代碼沒有按照您的想法執行。 嘗試這個:

String a = "apple2e";
String b = "apple2e";

System.out.println("a==b? " + a == b);    // "false"
System.out.println("a==b? " + (a == b));  // "a==b? true"

Java會自動插入所有字符串文字。 就是為什么第二個sysout打印它的功能。 第一個sysout只打印"false"因為字符串連接( + )的優先級高於== ,因此它等效於:

System.out.println("a==b? apple2e" == "apple2e");

我不認為那是你的意思!

另一方面,這將為您提供兩個單獨的String實例:

String a = new String("apple2e");
String b = new String("apple2e");

System.out.println("a==b? " + (a == b));  // "a==b? false"

這將是示意性的樣子

a (reference_id 123) ---------------  "apple2e"

b (reference_id 456) ---------------  "apple2e"

並且可以使用String#intern()簡化為原始情況:

String a = new String("apple2e").intern();
String b = new String("apple2e").intern();

System.out.println("a==b? " + (a == b));  // "a==b? true"

例如

a (reference_id 123) ------+
                           +---------  "apple2e"
b (reference_id 456) ------+

你的第一個例子實際上是真的。 println中的表達式並不符合您的意思。

String a = "apple2e";
String b = "apple2e";

System.out.println("a==b? " + (a == b));

會打印a==b? true a==b? true注意到所有重要的分組!

你是對的,a和b是對同一個對象的兩個不同的引用。 這正是為什么在測試時==返回true的原因! ==測試兩個不同的指針是否指向內存中的相同位置。 a和b都是對內存中相同位置的引用,它保存了interned編譯時間“apple2e”字符串。

現在,如果你這樣做了

String a = new String("apple2e");
String b = new String("apple2e");

System.out.println("a==b? " + (a == b));

它實際上會打印a==b? false a==b? false 因為你在內存中創建了兩個不同的對象,a和b指向不同的地方。

'a'和'b'是相同的參考,問題是你沒有比較a和b。 你應該期待

a==b? false

但你得到了

false

這是因為+優先於==所以你擁有的是什么

System.out.println(("a==b? " + a) == b);

以同樣的方式,您希望以下內容打印為true。

System.out.println(1 + 2 == 3);

你需要的是什么

System.out.println("a==b? " + (a == b));

a == b查看兩個對象是否指向內存中的同一對象。 因為他們沒有,即使他們的內部是相同的,a == b將是錯誤的。 1 == 1將是真的,因為整數是原始變量,而字符串實際上是對象。

a.equals(b)是一種實例方法,它在內部檢查兩個字符串是否具有相同的字符。

如果你這樣做:

String a = "hello";
String b = a;

那么 a == b就是真的。

apple2e不是一個對象。 它是引用指向的值。

String a = "apple2e";
String b = "apple2e";

這里, ab是存儲在兩個不同位置的值apple2e對象(引用)。

a和b是對同一對象的兩個不同引用 - 可能

"a==b? " + a

計算字符串“a == b?apple2e”,它與字符串“apple2e”絕對不一樣(==或等於)

所以你的代碼:

System.out.println("a==b? " + a == b);

只是測試“a == b?apple2e”是否與“apple2e”相同而不是(無論你如何定義)。

如果更改為以下內容: System.out.println("a==b? " + (a == b));

你得到a==b? true a==b? true

這里發生的是a和b都指向由String類維護的字符串的內部緩存。

這是String.equals()的實現

public boolean equals(Object anObject) {
if (this == anObject) {
    return true;
}
if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
        return false;
    }
    return true;
    }
}
return false;
}

anObject必須是String才能返回true,如果它是對同一個Object的引用,則它立即返回true。 否則,你可以看到,是通過字符比較做一個字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM