![](/img/trans.png)
[英]Why does String.intern() return different results under JDK8 and JDK9?
[英]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() == str1
和str3.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.