gpt4 book ai didi

java - Java中字符串连接运算符 "+"的困惑

转载 作者:行者123 更新时间:2023-12-01 07:53:16 24 4
gpt4 key购买 nike

据我所知,我们不能使用==运算符来比较Java中的String值。所以我写了下面的代码:

public class Test {
public static void main(String[] args) {

String s1 = "My Computer";
String s2 = "My" + " Computer";

System.out.println(s1 == s2);
}
}

我期望结果为false,因为这是两个不同的对象,分配了不同的内存位置(如果我错了,请在这方面纠正我)。但是当我执行代码时,输​​出是true

然后我将s2的值更改为:

String str = "My";
String s2 = str + " Computer"; //instead of "My" + " Computer"

然后当我执行代码时,输​​出为false

现在我无法理解这两个语句的区别,尽管我在两个语句中都使用了 + (不是 concat() 方法)。谁能解释一下,谢谢。

最佳答案

让你绊倒的是 this part of the specification :

The String object is newly created (§12.5) unless the expression is a constant expression (§15.28).

因此,当您将一个字符串常量连接到另一个字符串常量时,它会被视为常量表达式,因此将在编译时进行计算并替换为字符串常量“My Computer”。

您可以通过在编译的类上运行 javap -c 来验证这一点。

public class Test {

public static void main(String[] args) {

String s1 = "My Computer";
String s2 = "My" + " Computer";
String s3 = "My";
String s4 = s3 + " Computer";

System.out.println(s1 == s2); //true
System.out.println(s1 == s4); //false
}
}

编译为:

  public static void main(java.lang.String[]);
Code:
// s1 = "My Computer"
0: ldc #2 // String My Computer
2: astore_1

// s2 = "My" + " Computer"
3: ldc #2 // String My Computer
5: astore_2

// s3 = "My"
6: ldc #3 // String My
8: astore_3

// s4 = s3 + " Computer"
9: new #4 // class java/lang/StringBuilder
12: dup
13: invokespecial #5 // Method java/lang/StringBuilder."<
init>":()V
16: aload_3
17: invokevirtual #6 // Method java/lang/StringBuilder.ap
pend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: ldc #7 // String Computer
22: invokevirtual #6 // Method java/lang/StringBuilder.ap
pend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
25: invokevirtual #8 // Method java/lang/StringBuilder.to
String:()Ljava/lang/String;
28: astore 4

... the rest of the code omitted

如您所见,前两个赋值(对 s1s2)加载完全相同的常量 (#2),并且因此使用同一个对象。而对 s4 的赋值定义为 constant expression (即使足够聪明的编译器可以解决这个问题,但这是不允许的),因此您将获得整个“创建 StringBuilder,将字符串附加到其中,将结果转换为新字符串”的过程。

有趣的是,如果在上面的代码中将 final 修饰符添加到 s3,则会使 s3 + "Computer" 成为再次比较常量表达式,两次比较都会打印 true

毫无疑问,您已经知道,代码的正确性不能依赖于所有这些,但知道这是一件有趣的事情。

关于java - Java中字符串连接运算符 "+"的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33801144/

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