java - 如何从池或堆中查找字符串

标签 java

在下面的代码中,

  1. 如果 s3 被注释掉,则 s2==s2.intern() 的计算结果为 true。为什么?

  2. 如果 s3 未注释,则 s2==s2.intern() 的计算结果为 false。为什么?

我的理解是 concat() 方法总是返回一个新的字符串实例,即不是来自字符串池的实例。

public static void main(String[] args) {

    String s2 = "hitesh".concat("yadav");
    String s3 = "hiteshyadav";

    System.out.println(Integer.toHexString(System.identityHashCode(s2)));
    System.out.println(Integer.toHexString(System.identityHashCode(s2.intern())));
}

最佳答案

这是预期的行为。请注意以下事实:

  1. intern()实际执行字符串驻留时,其返回值与其参数相同;
  2. intern() 找到已驻留的字符串时,它会返回该实例而不是参数。

因此,当 s3 被注释掉时,s2 引用的 String 实例就是被实习的对象,并且 intern() 返回它。当 s3 存在时,这个预先存在的实例将由 intern() 返回。

要验证上述陈述并加深您的理解,请将以下行添加到您的代码中:

System.out.println(Integer.toHexString(System.identityHashCode(s3)));

你会发现第二行和第三行输出是相同的。

关于java - 如何从池或堆中查找字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25853340/

相关文章:

java - 应用程序启动后几分钟内 GC Tenuring 阈值就会下降

java - Xero 配置中 config.json 的路径

java - 当我保存对象时,我无法从任务加载

java - 带有产品 flavor 和 Kotlin 的 ClassNotFoundException

java - 获取文件修改时间

java - OpenLDAP 和 UnboundID : use of transactions

java - 在 JSP 和 Apache Derby 数据库中连接 Driver Manager 时出现 Classnotfound 异常/如何为普通 Java 应用程序构建数据库连接

java - Java 如何查找数组中所有奇数出现的元素

JAVA:我试图在类的新实例中传递字符串作为参数,但不断收到错误

java - 如何将数字换行?