0
的例子根據這篇文章ScjpTipLine-StringsLiterally我編碼一些例子,如:Understading字符串文字池
public static void main(String[] args) {
String literalString1 = "someString";
String literalString2 = "someString";
String string1 = new String("someString");
System.out.println(literalString1 == literalString2);
System.out.println(literalString1 == string1);
try {
Field stringValue = String.class.getDeclaredField("value");
stringValue.setAccessible(true);
char[] charValue = "someString".toCharArray();
Arrays.fill(charValue, 'a');
stringValue.set(literalString1, charValue);
} catch (Exception e) {}
System.out.println(literalString1);
System.out.println(literalString2);
System.out.println(string1);
}
的輸出中是預期:
true
false
aaaaaaaaaa
aaaaaaaaaa
someString
,但如果更改略高於代碼更換線
char[] charValue = "someString".toCharArray();
與
char[] charValue = (char[]) stringValue.get(literalString1);
你
true
false
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
這是自新的String意想不到的輸出( 「someString」); JVM有義務在運行時在堆上創建新的String對象,而不是使用字符串文字池中的literalString1和literalString2。
預先感謝