[英]Java 7 - String.intern() behaviour
我已經閱讀了有關如何檢查Java中是否存在字符串的答案 ,但我不理解以下結果:
String x = args[0]; // args[0] = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // true
但是,如果我聲明一個字符串文字:
String x = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // false
此外,在沒有任何字符串文字的情況下, args[0]
似乎可以直接插入:
// String x = "abc";
String y = args[0];
System.out.println(y.intern() == y); // true (???)
// false if the first line is uncommented
為什么y.intern() == y
會根據x
是否為文字而變化,即使對於使用命令行參數的示例也是如此?
我知道文字字符串在編譯時會被嵌入 ,但是我不明白為什么它會影響前面的示例。 我還閱讀了一些有關字符串實習的問題,例如字符串池行為 , 有關Java的字符串池和Java字符串池的問題-池何時更改? 。 但是,他們都沒有對此行為提供可能的解釋。
編輯:
我錯誤地寫道,在第三個示例中,如果String x = "abc";
結果不會改變String x = "abc";
被聲明,但確實如此。
這是因為如果之前未對該字符串進行過y.intern()
,則y.intern()
會返回y
。 如果字符串已經存在,則調用將返回最可能與y
不同的已經存在的實例。
但是,所有這些都高度依賴於實現,因此在不同版本的JVM和編譯器上可能有所不同。
實施細節可能有所不同。 但這正是我所期望的行為。 您的第一種情況意味着默認情況下不會保留命令行參數。 因此, y.intern()
在對y
進行引用之后將其返回。
第二種情況是VM自動實習文本,因此y.intern()
返回對x
的引用,該引用不同於y
。
最后一種情況再次發生,因為默認情況下沒有任何干預,因此對intern()
的調用將返回對y
的引用。 我認為更積極地實習String是合法的,但是據我所知,這是規范要求的最小行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.