【问题标题】:How Java String pool works? How does Java decide whether to use it or not? [duplicate]Java 字符串池是如何工作的? Java如何决定是否使用它? [复制]
【发布时间】:2019-12-14 09:23:23
【问题描述】:

我知道有一个字符串池,它应该保留一些创建的字符串,以免重复它们。因此,如果用户想要创建一个与另一个字符串具有相同值的字符串,则不会再次创建它(除非调用了new String()),它将是对同一对象的引用。 那么,我的问题是为什么这段代码的结果是“false false”?

String a = "string1";
String b = "string1";
String c = new String("string1");
System.out.println(a==b);
System.out.println(a==c);

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

【问题讨论】:

标签: java string pool string-pool


【解决方案1】:

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

字符串池概念适用于字符串的其他原因与 java 中字符串的不变性有关。

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

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

String a = "Testing"
String b ="this"
String c = "I am " + a + b + "code";

此类情况应使用stringbufferstringbuilder 处理。

总之,应该避免大量使用字符串池。使用此类场景时,应切换到字符串生成器。诸如字符串常量之类的东西 - "HEADER" 、 "http://" 等被多次使用仍然可以用作字符串文字。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2017-06-02
    • 2011-04-17
    • 2014-01-17
    • 2011-08-13
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多