在Java 中宣告Final 時使用== 比較字串
在Java 中,== 運算子比較兩個物件的記憶體算子比較兩個物件的記憶體引用。但是,當字串被宣告為 Final 並使用編譯時常數初始化時,會出現獨特的行為。
場景 1:非 Final 字串
考慮以下程式碼段:
String str1 = "str"; String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
此程式碼的結果將為 false。連線作業會建立一個新的 String 對象,它不等於預先存在的字串文字「string」。
場景2:最終字串
現在,讓我們將字串宣告為最終字串:
final String str1 = "str"; final String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
令人驚訝的是,結果現在是true。這是因為將字串宣告為 Final 允許編譯器內聯它們的值並將整個表達式視為編譯時常數表達式。
編譯器最佳化:實習
當編譯時常數表達式涉及字串時,Java 虛擬機(JVM) 會對其進行“實習”,這意味著它將字串的唯一實例儲存在稱為字串池的特殊位置。因此,第二個場景中的連接字串直接與中間字串「string」進行比較,得到真實的結果。
結論
將字串宣告為最終的編譯時常數導致最佳化器將表達式視為單一String 對象,從而允許對預先存在的字串文字進行語法相等性檢查(==)。這演示了 Java 中的編譯器最佳化以及它如何影響物件標識比較。
以上是在 Java 中將字串宣告為「final」是否會改變「==」比較它們的方式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!