[英]Difference between == and .equals in Java.
我知道這已被覆蓋,但我在SO上看到了不一致的論點。
所以,如果我有:
String a = "apple2e";
String b = "apple2e";
System.out.println("a==b? " + a == b);
我搞錯了 。
據我了解,這是因為a
和b
是對同一個對象的兩個不同引用( 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)。
由於字符串實習,並且僅因為字符串內部a
和b
是對同一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";
這里, a
, b
是存儲在兩個不同位置的值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.