我知道String的不可变性,但是我对String与串联的关系感到困惑。输出的是什么,为什么是下面的代码:
String str1="my string";
System.out.println(str1);
System.out.println(str1.concat(" gets appended"));
System.out.println(str1+" getting updated");
根据我的理解,str1
不应因为其不变性而被更改。因此,对于所有情况,输出应为我的字符串。
感谢您的所有澄清。但是,请查看下面的代码及其输出,
代码:
String str1= new String("First string");
String str2= "Second string";
System.out.println("String1: "+str1);
System.out.println("String2: "+str2);
str1 = str1.concat(" is now appended");
System.out.println(str1);
str2 = str2.concat(" is now appended");
System.out.println(str2);
str1 = str1+" is getting added";
System.out.println(str1);
str2 = str2+" is getting added";
System.out.println(str2);
输出:
String1: First string
String2: Second string
First string is now appended
Second string is now appended
First string is now appended is getting added
Second string is now appended is getting added
谁能告诉我为什么要修改它?我知道要修改一个字符串,我们需要使用StringBuilder类或StringBuffer类。但是,这里没有使用那些类,即使我使用了String,它也被修改了。 它在内部使用StringBuilder类还是StringBuffer类?我正在使用jdk版本8。
谢谢。
答案 0 :(得分:3)
在否点处,您要更改str1
的参考值。在您的示例中,您正在创建两个 new String
实例,它们的值为str1
以及您要附加的其他内容。
答案 1 :(得分:3)
调用String
和str1.concat(" gets appended")
时将返回新的str1 + "getting updated"
,但不会影响原始的str1
。
System.out.println(str1); // my string
System.out.println(str1.concat(" gets appended")); // my string gets appended
System.out.println(str1 + " getting updated"); // my string getting updated
System.out.println(str1); // my string
更新:
您需要强调变量和对象之间的区别。
str1
是变量,它是指字符串对象第一个字符串。当您呼叫str1 = str1+" is getting added";
时,实际上是让变量 str1
引用新的字符串现在添加的第一个字符串正在添加。
尝试一下:
String string = "original string";
String string_holder = string;
string = string + " contact";
System.out.println(string); // original string contact
System.out.println(string_holder); // original string, the original string is not affected
答案 2 :(得分:1)
System.out.println(str1.concat(" gets appended"));
System.out.println(str1+" getting updated");
原始字符串不变,都创建了一个新的字符串,并打印出来。
答案 3 :(得分:0)
调用str.concat1(str2)时String不变的原因是因为该方法是如何在String类中编写的。假设我们创建了自己的小示例类:
public class MutStr {
private String str;
public MutStr(String str) {
this.str = str;
}
public String addString(String input) {
str = str + input; //changes the object itself
return str; //returns the changed object
}
}
此类并非一成不变,因为在运行方法addString()时,我们更改了对象本身。但是,当我们更改方法时,可以使对象不可变:
public String addString(String input) {
String output = str + input; //create a new object
return output; //returns the new object
}
两个方法都返回相同的东西;将新的String添加到旧的String中,但是在内部,第一个方法更改对象本身,而第二个方法则不更改。
关键实现是方法返回的事物(println命令使用的事物)与对象本身不是同一事物。