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

时间:2014-09-15 17:15:25

标签: java

在下面的代码中,

  1. 如果s3被注释掉,则s2==s2.intern()评估为true。为什么呢?

  2. 如果取消注释s3,则s2==s2.intern()评估为false。为什么呢?

  3. 我的理解是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 个答案:

答案 0 :(得分:1)

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

  1. intern()实际执行字符串实习时,其返回值与其参数相同;
  2. intern()找到已经实现的字符串时,它会返回该实例而不是参数。
  3. 因此,当s3被注释掉时,s2引用的String实例是被实体化的实例,intern()返回它。如果存在s3,则intern()会返回此预先存在的实例。

    要验证上述陈述并提高您的理解,请在代码中添加以下行:

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

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