java字符串和StringBuilder

java字符串和StringBuilder,java,string,stringbuilder,Java,String,Stringbuilder,我混淆了字符串和字符串生成器。这是我的简单代码 StringBuilder sb1 = new StringBuilder("123"); String s1 = "123"; sb1.append("abc"); s1.concat("abc"); System.out.println(sb1 + " " + s1); 123abc的sb1输出。没关系!因为它使用append方法。但是字符串s1应该是abc123 但是它的输出是abc。为什么?concat方法的目的是什么?请给我解释一下

我混淆了字符串和字符串生成器。这是我的简单代码

StringBuilder sb1 = new StringBuilder("123");
String s1 = "123";
sb1.append("abc"); 
s1.concat("abc");
System.out.println(sb1 + " " + s1);
123abc的sb1输出。没关系!因为它使用append方法。但是字符串s1应该是abc123 但是它的输出是abc。为什么?concat方法的目的是什么?请给我解释一下

多谢各位

.但字符串s1应为abc123,但其输出为abc

字符串在Java中是不可变的
concat
不会更改现有字符串-它会返回一个新字符串。因此,如果您使用:

String result = s1.concat("abc");
然后那将是“123abc”-但
s1
仍将是“123”。(或者更确切地说,
s1
的值仍然是对内容为“123”的字符串的引用。)

对于
String
上您可能希望更改内容的任何其他方法也是如此,例如
replace
toLowerCase
。当您对字符串调用一个方法但不使用结果(这里就是这种情况)时,这几乎总是一个bug

字符串是不可变的这一事实是
StringBuilder
首先存在的全部原因

.但字符串s1应为abc123,但其输出为abc

字符串在Java中是不可变的
concat
不会更改现有字符串-它会返回一个新字符串。因此,如果您使用:

String result = s1.concat("abc");
然后那将是“123abc”-但
s1
仍将是“123”。(或者更确切地说,
s1
的值仍然是对内容为“123”的字符串的引用。)

对于
String
上您可能希望更改内容的任何其他方法也是如此,例如
replace
toLowerCase
。当您对字符串调用一个方法但不使用结果(这里就是这种情况)时,这几乎总是一个bug


字符串是不可变的这一事实是
StringBuilder
首先存在的全部原因。

concat函数不会更改字符串,但会返回在您的情况下未赋值的结果:

String concat(String textToAppend)
因此,改变:

s1 = s1.concat("abc");

concat函数不会更改字符串,但会返回在您的情况下未赋值的结果:

String concat(String textToAppend)
因此,改变:

s1 = s1.concat("abc");

字符串对象是不可变的。不可变只是指不可修改或不可更改

但是如果你给

String result = s1.concat("abc");
输出为123abc 和
StringBuilder
是可变的
您可以执行更改

字符串对象是不可变的。不可变只是指不可修改或不可更改

但是如果你给

String result = s1.concat("abc");
输出为123abc 和
StringBuilder
是可变的
您可以执行更改。concat(“abc”)将在堆中创建一个新对象,并将“abc”连接到s1。但s1仍然指向原始s1,即“123”。因此,您需要使用s1=s1.concat(“abc”)使s1引用指向新对象

concat(“abc”)将在堆中创建一个新对象,并将“abc”连接到s1。但s1仍然指向原始s1,即“123”。因此,您需要使用s1=s1.concat(“abc”)使s1引用指向新对象

字符串是不可变的。。。尝试读取字符串不可变概念s1的输出为123,但错误地将其写成abc。这让我很困惑:)字符串是不可变的。。。尝试读取字符串不可变概念s1的输出为123,但错误地将其写成abc。这让我很困惑:)非常感谢。现在我明白了。字符串是不可变的。StringBuilder是可变的。非常感谢。现在我明白了。字符串是不可变的。StringBuilder是可变的。