为什么使用.concat()和+;=使用Java字符串?

为什么使用.concat()和+;=使用Java字符串?,java,string,concatenation,Java,String,Concatenation,为OCAJ7学习 我知道字符串对象是不可变的。我知道在String对象上使用类似.concat()的方法只会创建一个具有相同引用名称的新String对象。然而,我很难做到以下几点: String str1 = "str1"; String str2 = "str2"; System.out.println( str1.concat(str2) ); System.out.println(str1); // ouputs // str1str2 // str1 String str3 = "f

为OCAJ7学习

我知道字符串对象是不可变的。我知道在String对象上使用类似
.concat()
的方法只会创建一个具有相同引用名称的新String对象。然而,我很难做到以下几点:

String str1 = "str1";
String str2 = "str2";
System.out.println( str1.concat(str2) );
System.out.println(str1);

// ouputs
// str1str2
// str1

String str3 = "fish";
str3 += "toad";
System.out.println(str3);

// outputs
// fishtoad

如果字符串是不可变的,为什么使用
+=
连接会影响原始字符串对象,而
.concat()
不会影响原始字符串对象?如果我只想使用
+=
连接字符串,那么使用
String
是否比使用
StringBuilder
更好,或者反之亦然

因为您在
str3

str3 += "toad";

因此,您连接并将结果分配回str3

+
相比,它更像
+=
。它返回新字符串;它不会修改原始字符串或参数(
string
s是不可变的)

相当于
str1+str2
,因此不会修改
str1
,并丢弃结果


但是,
+=
也将结果分配回左侧,
str3
现在引用新字符串。这就是区别。

是的,你是对的字符串是不可变的

但是,当您在System.out.println()内部写入
str1.concat(str2)
时,您正在打印concat()函数返回的结果。结果是一个新字符串,该字符串将在控制台上输出。 您尚未将该值分配给str1。

但是,当您编写
+=
时,首先要将某些内容连接到字符串,然后将引用分配回
str1


这解释了输出。

这里发生的是
String.concat(String)
实际上不会将
str1
str2
组合在一起,而是返回一个与
str1str2
等效的新字符串对象。当您使用
str1+=str2
时,实际上是在组合变量,然后将值放入
str1

concat()方法创建一个新字符串。您必须记住Java中的字符串是不可变的

如果o/p分配给str1,则str1将指向新创建的字符串

str1 = str1.concat(str2);
否则str1将继续指向旧字符串


如果要将多个字符串合并到一个循环中,那么最好使用上面的StringBuilder,因为您没有更改
System.out.println(str1.concat(str2))
中的
str1
的引用,所以它临时存储
str1.concat(str2)


但是在
str3+=str4
中,整个引用被移动到“fishtoad”中,因此它被更改。但是,如果您定义了一个字符串
str5=“fish”
,那么它会引用回前面的位置,该位置由
str3

引用,因为
concat
不会将连接结果分配给
str1
,它还了,好的。但是,如果字符串是不可变的,(因为它们使用
char[]
并且您不能向数组中添加更多元素),那么如何使用
+=
更改
str3
?因为使用
+=
会创建一个字符串的新实例,其中包含两个字符串的串联,并给出了对str3的引用
str3+=“toad”
将“fish”的原始字符串
str3
替换为“fishtoad”。concat()返回一个新实例,因此
str3+=“toad”
类似于
str3=str3.concat(“toad”)所以它仍然在创建一个新的字符串对象并将其分配给
str3
str3 += "toad" means
str3 = str3 + "toad";
str1.concat(str2)
str1 = str1.concat(str2);