簡體   English   中英

Java 檢查字符串的相等性

[英]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";

JLS 聲明(幾乎完全相同)對於Java 7Java 6

但請注意,某些 JDK 版本之間的字符串實習工作方式存在一些細微差別。 例如,參見“intern() 在 Java 6 和 Java 7 中的行為不同”

在這種情況下,由編譯器決定是否s1 == s2 條件是測試s1s2是否是同一個對象。 這很可能是真的,因為明智的編譯器會有一個常量池,但不一定如此。

但是,您的意圖是比較字符串,而不是對象,因此equals()是正確的方法,而 == 的使用不正確。

暫無
暫無

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

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