Java 为什么初始化字符串变量时要将某个字符串文字与另一个字符串变量串联在一起,这是最终的行为方式?

Java 为什么初始化字符串变量时要将某个字符串文字与另一个字符串变量串联在一起,这是最终的行为方式?,java,Java,此代码打印“B”。它不应该什么都不打印吗?我已经读到,连接(+)就像执行一个方法,因此它会产生一个新字符串,但这里不是这样。我想这可能是因为def变量是final,但def变量的复合运算符的工作方式不同 String abcdef = "abcdef"; final String def = "def"; String a = "abc"; a += def; String b = "abc" + def; Stri

此代码打印“B”。它不应该什么都不打印吗?我已经读到,连接(+)就像执行一个方法,因此它会产生一个新字符串,但这里不是这样。我想这可能是因为def变量是final,但def变量的复合运算符的工作方式不同

String abcdef = "abcdef";
final String def = "def";
String a = "abc";
a += def;
String b = "abc" + def;
String c = "abc";
c = c + def;
if(abcdef == a) {
    System.out.println("A");
}
if(abcdef == b) {
    System.out.println("B");
}
if(abcdef == c) {
    System.out.println("C");
}

这是因为
b
等于
“abc”+def
,而
def
等于
“def”
。因此,本质上,您是通过使用
abcdef==b
来比较
“abcdef”
“abcdef”


因此,总之,它不会什么也不打印,因为
“abcdef”==“abcdef”
的计算结果总是
true

我想您应该意识到您应该将字符串与
相等而不是
=
进行比较。但是,请查看字符串的标识哈希代码
abcdef
b
具有相同的值。这就是为什么它们在使用
==
时相等,它们从内部缓存中引用相同的对象

String abcdef = "abcdef";
final String def = "def";
String a = "abc";
a += def;
String b = "abc" + def;
String c = "abc";
c = c + def;
System.out.println("a = " + System.identityHashCode(a)
        + " abcdef = " + System.identityHashCode(abcdef));
System.out.println("b = " + System.identityHashCode(b)
+ " abcdef = " + System.identityHashCode(abcdef));
System.out.println("c = " + System.identityHashCode(c)
+ " abcdef = " + System.identityHashCode(abcdef));
if (abcdef == a) {
    System.out.println("A");
}
if (abcdef == b) {
    System.out.println("B");
}
if (abcdef == c) {
    System.out.println("C");
}
印刷品

a = 925858445 abcdef = 798154996
b = 798154996 abcdef = 798154996
c = 681842940 abcdef = 798154996
B

在Java中,运算符“==”检查两个操作数是否引用同一对象。不要对任何对象(包括字符串)使用“==”。注意Java字符串是不可变的。这意味着使用它们的所有操作都不会修改它们,而是创建新对象。

但是a和c也是“abcdef”,相应的if不打印“a”和“c”。只打印“B”。是比较两个文字字符串的结果将始终为真。但包含字符串的两个变量的计算结果不是真的。这取决于字符串是否已添加到文字池或已被插入。不要使用“==”来比较对象。“==”仅在对象具有相同内存时匹配。在许多情况下,一个字符串将被添加到一个“文字池”,因此它实际上会成为同一个对象。使用
equals(…)
方法。在本例中,“==”正好起作用,因为字符串被插入。