为什么我使用.concat()和+ =使用Java字符串获得不同的输出?

时间:2014-07-18 17:50:57

标签: java string concatenation

学习OCAJ7

我知道String对象是不可变的。我知道在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

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

7 个答案:

答案 0 :(得分:3)

因为您正在str3

中捕获新生成的String实例的引用
str3 += "toad";

str3 = str3 + "toad"

答案 1 :(得分:1)

concat method更像+而不是+=。它返回新的字符串;它不会修改原始字符串或参数(String s是不可变的)。

str1.concat(str2)

相当于str1 + str2,因此str1未被修改,结果将被废弃。

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

答案 2 :(得分:1)

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

但是当您在System.out.println()中编写str1.concat(str2)时,您正在打印concat()函数返回的结果。结果是在控制台上输出的新String。  您尚未将值指定给str1.

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

这解释了输出。

答案 3 :(得分:1)

这里发生的是String.concat(String);实际上并没有将str1str2组合在一起,而是返回一个等同于str1str2的新String对象。当您使用str1 += str2时,实际上是在组合变量,然后将值放入str1

答案 4 :(得分:0)

str3 += "toad" means
str3 = str3 + "toad";

所以你连接并将结果分配回str3

答案 5 :(得分:0)

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

如果分配了o / p,

str1将指向新创建的字符串

str1 = str1.concat(str2);

否则str1继续指向旧字符串。

如果要在循环中将多个字符串连接在一起,那么最好使用StringBuilder

答案 6 :(得分:0)

以上您不会更改str1System.out.println(str1.concat(str2) )的引用,因此它会临时存储str1.concat(str2)的引用。

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