学习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
更好,反之亦然?
答案 0 :(得分:3)
因为您正在str3
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);
实际上并没有将str1
和str2
组合在一起,而是返回一个等同于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)
以上您不会更改str1
中System.out.println(str1.concat(str2) )
的引用,因此它会临时存储str1.concat(str2)
的引用。
但是在str3+=str4
中,整个引用被移动到“fishtoad”,因此它会被更改。但是,如果您定义了字符串str5="fish"
,那么它再次引用回{{1}引用的先前位置}。