簡體   English   中英

Java 7-String.intern()行為

[英]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.

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