gpt4 book ai didi

Java - 反编译时字符串等于

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:59 26 4
gpt4 key购买 nike

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

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

if (s1 == s2) {
// Path 1
} else {
// Path 2
}

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

但我想知道——这段代码已经过编译和反编译。 如果所有字符串都已在编译时定义并驻留并且代码已编译 - s1.equals(s2) 是否有可能优化为“s1 == s2”?

最佳答案

我很怀疑。通常,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");
}
}

}

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

  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

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

关于Java - 反编译时字符串等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15958545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com