String 和StringBuffer,为什么选b啊

img


这个String不是和StringBuffer一样引用类型吗,地址传递后为什么会是ab b

因为函数调用,如果你让对象指向另一个,y=x,不会作用到调用者上,但是你改变对象本身的状态,x.append(y)因为是同一个对象,所以调用者的a实际上也修改了,所以选择b

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/26443
  • 这篇博客你也可以参考下:String和StringBuffer分别作为参数传递
  • 除此之外, 这篇博客: String类型字符串转换成其他类型中的 StringBuffer类 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在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对象之间不能。

     

  • 以下回答来自chatgpt:

    问题回答:

    这个问题涉及到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对象时效率更高些。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^