String,StringBuilder,StringBuffer

概括

String:不可变的字符序列,底层使用char[]存储

StringBuffer:可变的字符序列,线程安全的,效率低,char[]存储

StringBuilder:可变的字符序列,jdk5.0新增,线程不安全,效率高,char[]存储

源码分析

String str = new String();              // char[] value = new char[0]
String str = new String("abc");         // char[] value = new char[0]{'a','b','c'}
StringBuffer sb = new StringBuffer();   //char[] value = new char[16];
             sb.append("a");            //char[0]='a';
StringBuffer sb = new StringBuffer("abc");   //char[] value = new char["abc".length()+16];

StringBuilder和StringBuffer基本一样

扩容

如果添加的数据底层数组不够存,需要扩容,默认扩容到  原数组长度2倍+2,同时将原数组中的元素copy到新数组中

//需要扩容的时候,关键源码
int newCapacity = (value.length << 1) + 2;

编码建议

使用时预估字符长度,使用new StringBuilder(int capacity),new StringBuffer(int capacity)

StringBuffer线程安全

保证线程安全是通过方法使用synchronized关键字来实现的

StringBuffer,StringBuilder的常用方法

  增:append(xxxx):字符串拼接

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

  改:replace(int start,int end,String str)  :把[start,end)位置的字符串替换为str    |    void setCharAt(int n,char ch)

  查:char charAt() 

  长度:int length()

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

  遍历:for()+charAt()  / toString()

  其他:

     reverse():字符序列逆转

     int indexOf(String str)

     String subString(int start,int end)

特别的 append()方法,如果参数是null值,会调用一个private的appendNull()的方法,也就是说实际添加的是"null"字符串,和String类似

    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
    private AbstractStringBuilder appendNull() {
        int c = count;
        ensureCapacityInternal(c + 4);
        final char[] value = this.value;
        value[c++] = 'n';
        value[c++] = 'u';
        value[c++] = 'l';
        value[c++] = 'l';
        count = c;
        return this;
    }

 

 

 

 

 

 

 

 

  

posted @ 2022-05-31 19:25  鼠标的博客  阅读(31)  评论(0编辑  收藏  举报