与字符串实习相关

2022-09-02 20:36:02
public static void main(String[] args) {

    String a = new String("lo").intern();
    final String d = a.intern();
    String b = "lo";
    final String e = "lo";
    String c = "Hello";
    System.out.println(b==a);//true
    System.out.println(d==a);//true
    System.out.println(e==a);//true
    System.out.println(c=="Hel"+a); //why is this false? when e==a is true
    System.out.println(c=="Hel"+d); //why is this false?
    System.out.println(c=="Hel"+b); //why is this false?
    System.out.println(c=="Hel"+e); //this is true

}

这导致

true
true
true
false
false
false
true

表达式为 true 意味着相同的引用。那么为什么最后一个表达式是真的,而倒数第4个即是假的呢?e==ac== "Hel"+a


答案 1

表达式

"Hel" + a

不是编译时常量。实际上,它编译为:

new StringBuilder().append("Hel").append(a).toString()

(或类似)在运行时创建新的 String 对象。

但是,由于是 final,编译器可以确定 和 的值的串联是常量值,因此将其实习。e"Hel"e


答案 2

所有这些字符串都是在运行时计算的,这就是为什么它们不同的原因

System.out.println(c=="Hel"+a); //why is this false? when e==a is true
System.out.println(c=="Hel"+d); //why is this false?
System.out.println(c=="Hel"+b); //why is this false?

这个是在编译时计算的,因为e是最终的:

System.out.println(c=="Hel"+e); //this is true

如果将代码更改为:

    System.out.println(c==("Hel"+a).intern()); //why is this false? when e==a is true
    System.out.println(c==("Hel"+d).intern()); //why is this false?
    System.out.println(c==("Hel"+b).intern()); //why is this false?

所有这些都将产生真正的