Day020 String、StringBuffer和StringBuilder

StringBuffer类


  • java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。
  • 很多方法与String相同。
  • 作为参数传递时,方法内部可以改变值。
abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value; //value没有final声明,value可以不断扩容。

    /**
     * The count is the number of characters used.
     */
    int count;  //count记录有效字符的个数。
public class StringBufferBuilderTest {
    public static void main(String[] args) {
        StringBuffer sb1=new StringBuffer("abc");
        sb1.setCharAt(0,'m');
        System.out.println(sb1);

        StringBuffer sb2=new StringBuffer();
        System.out.println(sb2.length());
    }
}

输出结果:

mbc
0

String、StringBuffer、StringBuilder三者的异同


  • String:不可变的字符序列。底层用char[]存储。
  • StringBuffer:可变的字符序列。线程安全的,效率偏低。底层用char[]存储。
  • StringBuilder:可变的字符序列。线程不安全,效率高。底层用char[]存储。

扩容问题:如果要添加的数据底层数组盛不下,那就需要扩容底层的数组。默认情况下,扩容为

原来容量的2倍+2,同时将所有数组中的元素复制到新的数组中。

指导意义:开发中建议大家使用:StringBuffer(int capacity) 或StringBuider(int capacity)


StringBuffer类的常用方法


  • StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接。

  • StringBuffer delete(int start,int end):删除指定位置的内容。

  • StirngBuffer replace(int start,int end,String str):把[start,end)位置替换为str。

  • StringBuffer insert(int offset,xxx):在指定位置插入xxx。

  • StringBuffer reverse():把当前字符序列逆转。

  • 当append和insert时,如果原来value数组长度不够,可扩容。

  • 如上这些方法支持方法操作。

  • 方法链的原理:

     @Override
        public StringBuilder append(String str) {
            super.append(str);
            return this;
        }
    

效率比较StringBulder>StringBuffer>String

尚硅谷

posted @ 2021-05-20 22:18  南方风  阅读(52)  评论(0编辑  收藏  举报