爲什麼字符串「我不明白這一點。」進入字符串池。
"I don't get it."
字符串不進入實習池。
之一來驗證它的方法如下:
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2.append(" get it.");
String str = new String(str3.toString());
if (str == str.intern()) {
System.out.println("It was not interned before"); // <<== This is printed
} else {
System.out.println("It was interned before");
}
如果String
的內容被拘禁的intern()
呼叫將返回不同的(‘規範’)對象。正如你所看到的,上面返回的是同一個對象,這意味着你稱之爲intern()
的對象只是成爲了「規範」的對象(即被實施了)。
在另一方面,如果去掉append
,你會得到不同的結果:
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2;
String str = new String(str3.toString());
if (str == str.intern()) {
System.out.println("It was not interned before"); // <<== This is printed
} else {
System.out.println("It was interned before");
}
現在裏面str3
字符串是" I don't"
。它的副本已經被實施,因爲它與創建str2
時使用的字符串常量相同。
您可以通過側運行the first和the second程序方面看到自己的差異。
str2 == str3
爲true
的原因與字符串池無關(俚語爲"string interning")。兩者相等,因爲StringBuffer.append
返回其上append
被調用的對象,即str2
。你沒有第二個對象 - 只有一個StringBuffer
有兩個引用。該StringBuffer
的內容是" I don't"
和" get it."
字符串的串聯。
@assylias:是的,它會,因爲'的append()''返回this'。 –
OP很清楚爲什麼兩個對象是平等的。問題是爲什麼字符串「我不明白」。將在字符串池中。 –
它可能會誤導你的老師,但是如果通過插入到「字符串池」中,他暗示StringBuffers的值將被* interned *,那肯定是不正確的。 – Perception