Java 理解字符串文本池的一个示例
根据本文,我编写了一些示例,如:Java 理解字符串文本池的一个示例,java,string,string-literals,Java,String,String Literals,根据本文,我编写了一些示例,如: public static void main(String[] args) { String literalString1 = "someString"; String literalString2 = "someString"; String string1 = new String("someString"); System.out.println(literalString1 == literalString2); Syst
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();
与
你得到
true
false
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
这是一个意外的输出,因为新字符串(“someString”)JVM必须在运行时在堆上创建一个新的字符串对象,而不是使用字符串文本池中的literalString1和literalString2
提前谢谢
这是新字符串(“someString”)之后的意外输出;JVM必须在运行时在堆上创建一个新的字符串对象
它有义务创建一个新的字符串对象,是的
然而,字符串对象通常只是一个带有几个字段的标题和一个指向后备数组的指针。JVM可以自由地重用该备份阵列
字符串应该是不可变的,如果你做了一些微妙的事情试图破坏这种不可变性,你就不能保证它们将如何运行
true
false
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa