gpt4 book ai didi

java - 了解字符串文字池的示例

转载 作者:行者123 更新时间:2023-12-01 15:59:02 25 4
gpt4 key购买 nike

根据这篇文章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 必须在运行时在堆上创建一个新的 String 对象,而不是使用 来自字符串文字池的literalString1literalString2

提前致谢

最佳答案

which is an unexpected output since the new String("someString"); the JVM is obliged to create a new String object on the heap at run-time

有义务创建一个新的 String 对象,是的。

但是,字符串对象通常只是一个带有几个字段的 header 和一个指向后备数组的指针。并且 JVM 可以自由地重用该后备数组。

字符串应该是不可变的,如果你做了一些繁琐的事情来尝试违反这种不变性,你就无法保证它们的行为方式。

关于java - 了解字符串文字池的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4371974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com