编译器是否优化了字符串文字?

时间:2014-01-16 14:54:56

标签: java string string-literals

如果我有代码:

String s="a";
s="b";

请注意,这两个陈述之间没有s的引用或使用。

java编译器会对此进行优化,忽略第一个赋值并仅在字符串池中存储“b"”。

1 个答案:

答案 0 :(得分:2)

我的期望如下:

  • 字节码将包含两个字符串文字,因为我不希望javac(java - >字节码编译器)优化那种东西。
  • 如果文字字符串在字节码中,它将进入字符串池

可以使用以下代码进行测试:

public static void main(String[] args) throws Exception {
    String a = new String(new char[] { 'a' });   //don't use string 
    String b = new String(new char[] { 'b' });   //literals or they
    String c = new String(new char[] { 'c' });   //will be interned!

    String s = "a";
    s = "b";

    System.out.println("a is interned? " + (a.intern() != a));
    System.out.println("b is interned? " + (b.intern() != b));
    System.out.println("c is interned? " + (c.intern() != c));
}

打印:

  

是实习生吗?真正
  b是实习生?真正
  c是实习生?假

正如所料。

但请注意,JIT编译器在启动时几乎肯定会删除未使用的语句,但这不会从池中删除字符串。