gpt4 book ai didi

java - "=="在 Java 中的字符串连接的情况下

转载 作者:行者123 更新时间:2023-12-05 06:51:21 25 4
gpt4 key购买 nike

String a = "devender";
String b = "devender";
String c = "dev";
String d = "dev" + "ender";
String e = c + "ender";

System.out.println(a == b); //case 1: o/p true

System.out.println(a == d); //case 2: o/p true

System.out.println(a == e); //case 3: o/p false

a & b 都指向字符串常量池中的同一个字符串字面值。所以 true 在情况 1 中

String d = "dev" + "ender";

应该在内部使用类似的东西:

String d = new StringBuilder().append("dev").append("ender").toString();

ad 如何指向相同的引用而不是 ae

最佳答案

发生了四件事:

  1. (你清楚地知道这一点,但对于潜伏者)== 测试变量是否指向相同的String对象,而不是等价 字符串。所以即使 x"foo" 并且 y 也是 "foo"x == y 可能是 true 或 false,这取决于 xy 是指相同的 String 对象还是不同的对象。这就是我们使用 equals 的原因,而不是 ==,比较字符串的等价性。以下所有内容只是为了解释为什么 == 有时为真,并不是建议使用 == 来比较字符串。 :-)

  2. 同一类中的等效字符串常量(编译器知道的字符串是根据 JLS 中的各种规则的常量)由编译器引用相同的字符串(它也在类的 "constant pool" 中列出它们) ).这就是为什么 a == b 是真的。

  3. 加载类时,它的每个字符串常量自动为 interned — 检查 JVM 的字符串池是否有等效字符串,如果找到,则使用 String 对象(如果没有,则添加新常量的新 String 对象到游泳池)。因此,即使 x 是在类 Foo 中初始化的字符串常量,而 y 是在类 Bar 中初始化的字符串常量,它们将是 == 彼此。

    上面的第 2 点和第 3 点部分包含在 JLS§3.10.5 中. (关于类常量池的部分是一些实现细节,因此链接到前面的 JVM 规范;JLS 只是谈到实习。)

  4. 如果编译器处理常量值,它会进行字符串连接,所以

    String d = "dev" + "ender";

    编译为

    String d = "devender";

    "devender" 是一个字符串常量,编译器和 JVM 将上面的第 2 点和第 3 点应用到。例如,没有使用 StringBuilder,连接发生在编译时,而不是运行时。这包含在 JLS§15.28 - Constant Expressions 中.所以 a == da == b 是真的一样:它们指的是同一个常量字符串,所以编译器确保它们指的是同一个字符串类的常量池中的字符串。

    当任何操作数不是常量时,编译器不能这样做,所以它不能这样做:

    String e = c + "ender";

    ...即使代码分析可以很容易地表明 c 的值肯定会是 "dev" 因此 e 肯定会成为“开发者”。具体而言,规范仅让编译器使用常量值进行连接。因此,由于编译器无法执行此操作,它会输出您引用的 StringBuilder 代码,并且该工作在运行时完成,创建一个新的 String 对象。该字符串不会自动驻留,因此 e 最终引用与 a 不同的 String 对象,因此 a = = e 为假。

    请注意 as Vinod said ,如果您将 c 声明为 final:

    final String c = "dev";

    那么它将是一个constant variable (是的,他们真的这么叫)所以 §15.28 将适用并且编译器将转向

    String e = c + "ender";

    进入

    String e = "devender";

    a == e 也为真。

重申一下:这些都不意味着我们应该使用 == 来比较字符串的等价性。 :-) 这就是 equals 的用途。

关于java - "=="在 Java 中的字符串连接的情况下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66184515/

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