java String和StringBuilder

时间:2014-03-27 06:48:35

标签: java string stringbuilder

我对String和String Builder感到困惑。这是我的简单代码

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方法的目的?请解释一下。

谢谢

4 个答案:

答案 0 :(得分:15)

  

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

字符串在Java中是不可变的。 concat未更改现有字符串 - 它会返回字符串。所以如果你使用:

String result = s1.concat("abc");

然后 将是" 123abc" - 但s1仍将是" 123"。 (或者更确切地说,s1的值仍然是对包含内容" 123"的字符串的引用。)

对于{em}可能期望更改内容的String上的任何其他方法也是如此,例如: replacetoLowerCase。当你在字符串上调用方法但不使用结果时(就像这里的情况一样),这几乎总是一个错误。

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

答案 1 :(得分:3)

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

String concat(String textToAppend)

所以改变:

s1 = s1.concat("abc");

答案 2 :(得分:3)

字符串对象是不可变的。不可改变只是意味着不可修改或不可改变

但如果你给出

String result = s1.concat("abc");

输出为123abc 和 StringBuilder是可变的 你可以进行改变

答案 3 :(得分:1)

s1.concat(" abc")将使用" abc"在堆中创建一个新对象。连接到s1。但是s1仍然指向原来的s1,即" 123"。所以你需要使用s1 = s1.concat(" abc");

使你的s1引用指向新对象