[英]Java check equality for Strings
編輯:我已經在 java 中測試了這段代碼,打印的輸出是"true" ,而編譯器比較引用而不是 Strings 的值,為什么這是“true”?
public class Main {
public static void main(String[] args) {
String s1 = "string";
String s2 = "string";
System.out.println(""+(s1==s2));
}
}
Java 8 中的 String 相等規則沒有改變,在這種情況下s1==s2
打印始終為true
,因為它們都指向常量池中的相同內存位置,通常位於堆內存中。
我剛剛檢查了 Java6,這是真的。
沒有變化,== 運算符檢查兩個引用是否指向同一個對象。 字符串文字被放置在字符串池中。 所以“字符串”被放置在字符串池中,s1 和 s2 都指向那個,因此輸出為真。
在您編輯的問題中,您定義了兩個String 文字。 根據JLS § 3.10.5這些文字是實習的:
字符串字面量總是指類 String 的同一個實例。 這是因為字符串文字 - 或者更一般地說,作為常量表達式(第 15.28 節)的值的字符串 - 使用 String.intern 方法被“嵌入”以便共享唯一實例。
因此,對於s1 == s2
,使用==
引用相等將始終返回true
,其中:
String s1 = "string";
String s2 = "string";
但請注意,某些 JDK 版本之間的字符串實習工作方式存在一些細微差別。 例如,參見“intern() 在 Java 6 和 Java 7 中的行為不同”
在這種情況下,由編譯器決定是否s1 == s2
。 條件是測試s1
和s2
是否是同一個對象。 這很可能是真的,因為明智的編譯器會有一個常量池,但不一定如此。
但是,您的意圖是比較字符串,而不是對象,因此equals()
是正確的方法,而 == 的使用不正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.