Java - 反编译时字符串等于

and*_*oot 11 java string optimization equality string-interning

我前几天反编译了一些Java代码并发现了这个:

String s1 = "something";
String s2 = "something_else";

if (s1 == s2) {
// Path 1
} else {
// Path 2
}
Run Code Online (Sandbox Code Playgroud)

显然使用'=='来测试字符串相等是不好的

但我想知道 - 这段代码已被编译和反编译.如果在编译时已经定义了所有字符串并且已经编译并且代码已经编译 - 是否可能s1.equals(s2)已经优化到's1 == s2'?

NPE*_*NPE 8

我非常怀疑它.通常,Java编译器通过字节码优化做很少的事情,将优化留给JIT阶段.

我已经尝试了一点,我的编译器对以下内容没有做任何有趣的事情:

public class Clazz {

    public static void main(String args[]) {
        final String s1 = "something";
        final String s2 = "something_else";
        if (s1.equals(s2)) {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

这可能是最容易优化的情况.但是,字节码是:

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #16                 // String something
       2: astore_1      
       3: ldc           #18                 // String something_else
       5: astore_2      
       6: ldc           #16                 // String something
       8: ldc           #18                 // String something_else
      10: invokevirtual #20                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      13: ifeq          27
      16: getstatic     #26                 // Field java/lang/System.out:Ljava/io/PrintStream;
      19: ldc           #32                 // String yes
      21: invokevirtual #34                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      24: goto          35
      27: getstatic     #26                 // Field java/lang/System.out:Ljava/io/PrintStream;
      30: ldc           #40                 // String no
      32: invokevirtual #34                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      35: return        
Run Code Online (Sandbox Code Playgroud)

因此,我强烈怀疑它==是原始源代码的一部分.