0
点赞
收藏
分享

微信扫一扫

StringBuffer&StringBuilder

阎小妍 2022-03-16 阅读 67

一、StringBuffer:

1. 是可变长的,内容可以直接增删,是一个容器,存放字符数组的位置在父类AbstructStringBuilder的char[] value中,与String不同,该数组不是final的,是存放在堆中的,如果想要继续添加字符,在不超过原本数组长度的情况下,可以直接追加。

而String每次更改都要重新创建对象,更改string变量指向的地址值,因为其字符数组保存的地址值是final不可更改的,所以每次只能重新创建string对象。

2. StringBuffer类是final的,不能被继承。

3. 构造器:

(1)new StringBuffer():默认传入16,16为value的默认大小

(2)new StringBuffer(int capacity):给定value的大小

(3)new StringBuffer(String str):底层调用 super(str.length()+16); append(str);

(4)new StringBuffer(CharSequence seq):传入字符序列,不常用

4. String和StringBuffer的互相转换:

(1)String——>StringBuffer:

(1.1)new StringBuffer(String str)

(1.2)StringBuffer sb = new StringBuffer(); sb.append(str);

(2)StringBuffer——>String:

(2.1)new String(stringbuffer);

(2.2)stringbuffer.toString();

5. 常用方法:

(1)append():里面可以传字符、字符串、数字、布尔等,都可以转为字符类型添加进去

(2)toString():底层是

if (toStringCache == null) {//这里的toStringCache是被transient修饰的不能被序列化的私有属性
    toStringCache = Arrays.copyOfRange(value, 0, count);//现将value复制
}
return new String(toStringCache, true);//重新new一个string对象

(3)delete(start,end):删除StringBuffer对象的 [start,end)的部分

(4)replace(start,end,str):将[start,end)部分替换为str

(5)indexOf(str):str在StringBuffer中的首次出现位置

(6)insert(index,str):在index位置插入str,原来该位置上的字符向后推移

(7)length()

6. 练习:

 (1)底层调用父类的append方法

if (str == null)
    return appendNull();

其中

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;
}

可以看出,添加的字符串是null的话,也会追加“null”

(2)会调用length(),因此会有空指针异常

public StringBuffer(String str) {
    super(str.length() + 16);
    append(str);
}

(3)简单应用insert:给小数点前面的数每三个一组加上“,”

public static void main(String[] args) {
        //给字符串加上逗号分隔其代表的数字
        String s = "31231.23";
        StringBuffer sb = new StringBuffer(s);
        for(int i = sb.lastIndexOf(".")-3;i>0;i-=3){//先往前挪三位再判断
            sb.insert(i,",");
        }
        sb.length();
        String str = null;
        sb.append(str);
        System.out.println(sb.toString());
    }

1. 两者的父类都是AbstructStringBuilder,二者的方法都是相同的,只是线程安全性不同。

二、StringBuilder:

1. 其与StringBuffer的区别是不是线程安全的,用在字符串缓冲区被单个线程使用的时候,因为他没有synchronize互斥

2. 在单线程情况下比StringBuffer快,是其一个简易替换

3. 其父类和StringBuffer一致,都是AbstructStringBuilder。

三、效率上 StringBuilder > StringBuffer > String

四、小结

 

 

举报

相关推荐

0 条评论