gpt4 book ai didi

java - 为什么 Java 字符串比较在 Java 15 和 Java 11 中表现不同?

转载 作者:行者123 更新时间:2023-12-03 07:30:51 26 4
gpt4 key购买 nike

请考虑以下类:

class Eq {
public static void main(String[] args) {
System.out.println("" == ".".substring(1));
}
}
该示例应该显示内存中可能存在空字符串的多个副本。我仍然有一个旧的 OpenJDK 11,其中程序输出 false正如预期的那样。在 OpenJDK 15 下,程序输出 true .为类文件生成的字节码看起来相似(即使它们的寄存器值不同):
java 11:
public static void main(java.lang.String[]);
Code:
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #13 // String
5: ldc #15 // String .
7: iconst_1
8: invokevirtual #17 // Method java/lang/String.substring:(I)Ljava/lang/String;
11: if_acmpne 18
14: iconst_1
15: goto 19
18: iconst_0
19: invokevirtual #23 // Method java/io/PrintStream.println:(Z)V
22: return
java 15:
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String
5: ldc #4 // String .
7: iconst_1
8: invokevirtual #5 // Method java/lang/String.substring:(I)Ljava/lang/String;
11: if_acmpne 18
14: iconst_1
15: goto 19
18: iconst_0
19: invokevirtual #6 // Method java/io/PrintStream.println:(Z)V
22: return
我试图通过阅读“.”来排除静态编译器优化。来自标准输入,但这不会改变结果。我试图通过 -Djava.compiler=NONE 禁用 JIT并通过 -XX:StringTableSize=100000 调整字符串表的大小。 .我现在有以下问题:
  • 有人可以重现这个问题吗(即我做对了吗?如果有帮助,我可以提供类文件)
  • 我如何找出不同行为的确切原因?
  • (在您看来)不同行为的根源是什么?

  • 我认为只是策略来解决如何找到不回答问题的行为的原因也可能很有趣。

    最佳答案

    这在 JDK 15 Release Notes 中提到.
    根据 JDK-8240094 的要求对其进行了更改:

    JDK-8240094 : Optimize empty substring handling

    String.substring return "" in some cases, but could be improved to do so in all cases when the substring length is zero.


    有关的:

    JDK-8240225 : Optimize empty substring handling

    Optimize String.substring and related operations like stripLeading, stripTrailing to avoid redundantly creating a new empty String.


    子任务:

    JDK-8251556 : Release Note: Optimized Empty Substring Handling

    The implementation of String.substring and related methods stripLeading and stripTrailing have changed in this release to avoid redundantly creating a new empty String. This may impact code that depends on unspecified behaviour and the identity of empty sub-strings.

    关于java - 为什么 Java 字符串比较在 Java 15 和 Java 11 中表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65134181/

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