因为函数调用,如果你让对象指向另一个,y=x,不会作用到调用者上,但是你改变对象本身的状态,x.append(y)因为是同一个对象,所以调用者的a实际上也修改了,所以选择b
不知道你这个问题是否已经解决, 如果还没有解决的话:在Java中,由于String类是final类型的,所以使用String定义的字符串是一个常量,因此它一旦创建,其内容和长度是不可改变的,如果对一个字符串进行修改,则只能创建新的字符串。于是StringBuffer类,其实StringBuilder类也可以操作字符串,和StringBuffer功能相似,而StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能,所以性能略高。通常情况下,如果创建一个内容可变的字符串对象,应该优先考虑StringBuilder类。
StringBuilder类的添加append(),插入insert(),替换replace(),删除delete()同StringBuffer
方法声明 | 功能描述 |
StringBuffer append(char c) | 添加字符到StringBuffer对象中末尾 |
StringBuffer insert(int offset,String str) | 在StringBuffer对象中的offset位置插入字符串str |
StringBuffer deleteCharAt(int index) | 移除StringBuffer对象中指定位置的字符 |
StringBuffer delete(int start,int end) | 将StringBuffer对象中指定范围的字符或字符串 |
StringBuffer replace(int start,int end,String s) | 将StringBuffer对象中指定范围的字符或字符串用新的字符串s进行替换 |
void setCharAt(int index,char ch) | 修改指定位置index处的字符 |
String toString() | 返回StringBuffer缓冲区中的字符串对象 |
StringBuffer reverse() | 将此StringBuffer对象用其反转形式取代 |
append()和insert()方法是最常用的,并且这两个方法有很多重载形式,都用于添加字符。append()方法始终将这些字符添加到缓冲区的末尾,而insert()方法则可以在指定的位置添加字符。delete()方法用于删除指定位置的字符,包含起始索引,不包含结束索引,setCharAt()和replace()方法用于替换指定位置的字符。
StringBuffer类和String类的区别
1.String类定义的字符是常量,一旦创建后,内容和长度都是无法改变的。StringBuffer表示字符容器,其内容和长度可以随时修改。在操作字符串式,如果该字符串仅用于表示数据类型,则使用String类即可,但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer类或者StringBuilder类
2.String类重写了Object类的equals()方法,而StringBuffer类没有重写Object类的equals()方法。
3.String类对象可以用操作符+进行连接,而StringBuffer对象之间不能。
问题回答:
这个问题涉及到String和StringBuffer的不同之处,String是不可变类型,每次在修改String时都需要新建一个String对象,而StringBuffer是可变类型,可以在原对象上进行修改。
在这个问题中,使用String类型时每一次循环都会新建一个包括"ab"的新的String对象,然后再用" "连接,从而出现了"ab b"的情况。而使用StringBuffer时,每次循环只需要在原来的对象上进行append操作,不会新建对象,因此输出的结果是"abb"。
如果你想要解决这个问题,可以考虑在使用String类型时,将每次循环的结果赋值给原来的String对象,而不是新建一个对象,从而避免出现"ab b"的情况。具体的代码实现如下所示:
String a = "a";
for (int i = 0; i< 10; i++){
a = a + "b";
}
System.out.println(a);
这样输出的结果就是"abb"了。但是由于String是不可变类型,因此每次修改String都会新建一个对象,对于大数据量的操作会影响性能。因此,在需要进行大量字符串操作时,建议使用StringBuffer或StringBuilder类型。相对于String类型,它们的效率更高,比如使用StringBuffer实现上述代码:
StringBuffer b = new StringBuffer("a");
for (int i = 0; i< 10; i++){
b.append("b");
}
System.out.println(b.toString());
输出结果依然是"abb",但是比使用String对象时效率更高些。