この記事ScjpTipLine-StringsLiterallyによると、次のようないくつかの例をコーディングしていました。
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
new String("someString");以来の予期しない出力です。JVM は、文字列リテラル プールのliteralString1 とliteralString2を使用するのではなく、実行時にヒープに新しい String オブジェクトを作成する必要があります。
前もって感謝します