簡體   English   中英

為什么String.intern()方法返回兩個不同的結果?

[英]Why does the String.intern() method return two different results?

我有這樣的代碼:

String str1 = new StringBuilder("計算機").append("軟件").toString();
System.out.println(str1.intern() == str1); //true

String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); //false

String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3); //true

我能理解為什么str1.intern() == str1str3.intern() == str3都是真的,但我不明白str2.intern() == str2 為什么這是假的?

我的java版本是:1.8.0_73

String.intern()返回字符串文字池中的String。 但是,如果池中已存在該字符串,則它將返回現有的String。

如果你選擇一個新的String,它應該返回你創建的String,但是如果你使用池中恰好存在的String,你將獲得現有的String。

可以合理地假設在這種情況下, "java"已經存在於池中,所以當你調用intern()時它會返回一個不同的對象,所以==是false。

注意: string.intern().equals(string)應該始終為true。

常量String "java"已存在於Java常量池中,但您可以通過更改來驗證它

String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern()==str2);

String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == "java");

這將獲得相同的常量和輸出

true

或者 ,您可以將"計算機軟件""String"到常量池中

String a = "計算機軟件";
String b = "String";
String str1 = new StringBuilder("計算機").append("軟件").toString();
System.out.println(str1.intern() == str1);

String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3);

然后你會得到(與你的觀察一致)

false
false

暫無
暫無

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

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