StringBuilder与StringBuffer联系与区别

StringBuffer是线程安全的

面试被问到StringBuilder和StringBuffer的区别,心想终于问到个会的问题了(-,-原谅我太水。。。),信誓旦旦的说一个是线程安全的,一个不是线程安全的,面试大哥说既然StringBuffer是线程安全的,还没说完,我打断他说,StringBuilder是线程安全的。。。。(唉。。。嘴贱。。。),我竟然错了这么久。。。

由于StringBuffer是线程安全的,所以在性能上会有所下降。

联系

两者都是继承自AbstractStringBuilder这个抽象类,AbstractStringBuilder类实现了appenddeletecharAtinsert等方法。

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;

    /**
     * The count is the number of characters used.
     */
    int count;

上面是这个类的声明和最主要的两个变量,一个用来存储字符,一个用来表示实际的长度。

value数组长度不足时,会调用expandCapacity方法扩展长度,新的长度计算方法为:

int newCapacity = value.length * 2 + 2;

然后通过System.arrayCopy方法将数组复制过去。
可以看到这里的容量是以两倍递增的,而默认初始化容量只有16,所以如果可以实现确定字符串的规模,应该尽量指定StringBuilderStringBuffer的容量,一方面可以避免扩容,另一方面也可以减少空间浪费

StringBuilder基本与AbstractStringBuilder相同,而StringBuffer重写了大部分方法为synchronized方法。

例如

    public synchronized char charAt(int index) {
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        return value[index];
    }

    public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值