Concat的实习生如何工作

时间:2017-10-08 08:55:24

标签: java string constants pool

String a = "x";
String b = a + "y";
String c = "xy";
System.out.println(b==c);

为什么打印 false

按照我的理解" xy"(这是+" y")将被实习,当创建变量c时,编译器将检查是否为文字" xy&#34 ;如果存在,则存在于String常量池中,然后它将为c指定相同的引用。

注意:我不是要求equals()vs == operator。

2 个答案:

答案 0 :(得分:1)

如果通过连接两个字符串文字形成一个字符串,它也将被实现。

String a = "x";
String b = a + "y"; // a is not a string literal, so no interning
------------------------------------------------------------------------------------------
String b = "x" + "y"; // on the other hand, "x" is a string literal
String c = "xy";

System.out.println( b == c ); // true

以下是Java中字符串实习的常见示例

class Test {
    public static void main(String[] args) {
        String hello = "Hello", lo = "lo";

        System.out.print((hello == "Hello") + " ");
        System.out.print((Other.hello == hello) + " ");
        System.out.print((other.Other.hello == hello) + " ");
        System.out.print((hello == ("Hel"+"lo")) + " ");
        System.out.print((hello == ("Hel"+lo)) + " ");
        System.out.println(hello == ("Hel"+lo).intern());
    }
}

class Other { static String hello = "Hello"; }

后跟输出

true
true
true
true
false
true

答案 1 :(得分:0)

分配给"xy"的{​​{1}}被立即添加到字符串池(由c使用)的原因是因为该值在编译时已知。< / p>

intern在编译时是未知的,但仅在运行时。因为a+"y"是一项昂贵的操作,除非开发人员明确地对其进行编码,否则通常不会这样做。