Java字符串池是如何工作的?Java如何决定是否使用它?

Java字符串池是如何工作的?Java如何决定是否使用它?,java,string,pool,string-pool,Java,String,Pool,String Pool,我知道有一个字符串池,它应该保存一些创建的字符串,以便不复制它们。因此,如果用户希望创建一个与另一个字符串具有相同值的字符串,则不会再次创建该字符串(除非调用了new string()),它将是对同一对象的引用。 所以,我的问题是,为什么这个代码的结果是“假假” 我感兴趣的是为什么会这样,而不是如何让Java使用池。上述代码的正确输出为true-false。 而字符串池为什么存在的答案就是简单地优化内存使用。当可以在池中保存一次并在JVM运行时使用时,每次在堆内存中存储相同的字符串有什么意义。

我知道有一个字符串池,它应该保存一些创建的字符串,以便不复制它们。因此,如果用户希望创建一个与另一个字符串具有相同值的字符串,则不会再次创建该字符串(除非调用了
new string()
),它将是对同一对象的引用。 所以,我的问题是,为什么这个代码的结果是“假假”


我感兴趣的是为什么会这样,而不是如何让Java使用池。

上述代码的正确输出为true-false。 而字符串池为什么存在的答案就是简单地优化内存使用。当可以在池中保存一次并在JVM运行时使用时,每次在堆内存中存储相同的字符串有什么意义。 另一方面,当我们明确提到java来创建一个新对象
String s=new String(“test”)
时,它应该作为一个新对象创建,并且应该单独存储在堆中(而不是字符串池中),因此每次引用这个特定引用(对象s)时都可以更新这根本不会影响字符串池

字符串池概念适用于字符串的另一个原因与java中字符串的不变性有关

接下来如何决定何时使用什么

Java识别并存储字符串池中的每个字符串文本。 如果在您的特定用例中有大量的字符串处理,您应该小心地使用文本,因为如果您的代码在字符串池中创建大量字符串,它最终可能会导致内存错误。此外,在处理重字符串对象的串联时,应该完全避免

String a = "Testing"
String b ="this"
String c = "I am " + a + b + "code";
此类场景应使用
stringbuffer
stringbuilder
处理


总之,应该避免大量使用字符串池。在使用此类场景时,On应该切换到字符串生成器。像“HEADER”、“http://”等被多次使用的字符串常量仍然可以用作字符串文本。

为我打印“true-false”(正如我所期望的那样)。你是在什么环境下测试的?看,对我来说,这也是真是假。这就是我们所期望的,对吗?这能回答你的问题吗?
String a = "Testing"
String b ="this"
String c = "I am " + a + b + "code";