gpt4 book ai didi

java - 字符串常量池

转载 作者:IT老高 更新时间:2023-10-28 20:32:56 24 4
gpt4 key购买 nike

正如这些 Stackoverflow 问题中所述:question 1 & question 2我知道“字符串文字”是 interned什么时候:

String s = "abc"; 

JVM 将创建一个新的字符串对象,而不是使用字符串池中的现有对象:

String s = new String("abc");

但是,在阅读了以下两个类似的陈述后,我有一个疑问。

When the compiler encounters a String literal, it checks the pool to see if an identical String already exists. If a match is found, the reference to the new literal is directed to the existing String, and no new String literal object is created.

In this case, we actually end up with a slightly different behavior because of the keyword "new." In such a case, references to String literals are still put into the constant table (the String Literal Pool), but, when you come to the keyword "new," the JVM is obliged to create a new String object at run-time, rather than using the one from the constant table.

因此,如果我们在使用“new”并基于上述定义创建对象时,也将引用放在非池内存中AND 到池内存中。 当我们这样做时,JVM 不应该也返回相同的引用吗?:

String one = new String("test");
String two = "test";

System.out.println(one.equals(two)); // true
System.out.println(one == two); // false

因为在声明字符串字面量时 String three = "test"; 就已经存在于池中了?因此应该返回相同的引用并打印 true?或者前面的语句是否意味着它们将被放入池内存中,但在使用 new 运算符时只是跳过?

最佳答案

也许这会帮助你理解:

String literal = "test";
String one = new String(literal);
String two = "test";

System.out.println(literal == two); //true
System.out.println(one == two); //false

在您发布的示例中:

String one = new String("test");
String two = "test";

传递给构造函数 String(String) 的引用与引用 two 的值相同,这是由于实习。但是,字符串本身(由这两个引用引用)用于构造一个 new 对象,该对象被分配给引用 one

在这个例子中,恰好有两个 String 使用值“test”创建:一个在常量池中维护,并在您使用文字 “test”时被引用 code> 在表达式中,第二个由“new”运算符创建并分配给引用 one

编辑

也许你对这个说法感到困惑:

When the compiler encounters a String literal, it checks the pool to see if an identical String already exists.

请注意,这可能更清楚地表述为:

When the compiler encounters a String literal, it checks to see if an identical String already exists in the pool.

字符串仅在显式实习或通过类使用文字时才放入池中。因此,例如,如果您有这种情况:

String te = "te";
String st = "st";

String test = new String(te) + new String(st);

然后,当一个 Stringexist 并带有 test 值时,该 String 将不存在 在池中因为字面量 "test" 从未发生过。

关于java - 字符串常量池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14150628/

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