我对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方法的目的?请解释一下。
谢谢
答案 0 :(得分:15)
。但字符串s1应为abc123,但输出为abc。
字符串在Java中是不可变的。 concat
未更改现有字符串 - 它会返回新字符串。所以如果你使用:
String result = s1.concat("abc");
然后 将是" 123abc" - 但s1
仍将是" 123"。 (或者更确切地说,s1
的值仍然是对包含内容" 123"的字符串的引用。)
对于{em}可能期望更改内容的String
上的任何其他方法也是如此,例如: replace
和toLowerCase
。当你在字符串上调用方法但不使用结果时(就像这里的情况一样),这几乎总是一个错误。
字符串是不可变的这一事实是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引用指向新对象