String StringBuffer和StringBuilder

String StringBuffer和StringBuilder

     首先这三者都是用来存储字符串的。

      String、StringBuffer、StringBuilder都是被final修饰的,是不能够被继承改写的。

     String存储的字符串常量,存储在字符串常量区(方法区中的一块地方)。所谓常量,即不可以改变的类型。
当我们定义一个String str1="aaa" ,这时就会在字符串常量区生成一个新的字符串对象“aaa”,str1则指向“aaa”,str1是“aaa”的一个引用。
再定义一个String str2=“bbb”。
         当我们执行拼接字符串操作时,比如String str3=str1+str2时,就会在字符串常量区生产一个新的对象“aaabbb”,str3则指向这个新的字符串。

        这种方式的弊端是会生成很多无用的字符串,比如“aaa”,"bbb"在生成str3之后可能就不使用了,但是他们还占据着常量区的空间。



        StringBuffer是可拼接的字符串,在原来的字符串上可以实现添加(append)和删除(delete)操作。这种形式的字符串不会像String那样需要生成每一个对象再实现拼接,自始自终就只有一个对象,因此就比较节约空间。

StringBuffer是线程安全的字符串,主要方法上都加了synchronized同步。

@Override
    public synchronized int length() {
        return count;
    }

    @Override
    public synchronized int capacity() {
        return super.capacity();
    }


    @Override
    public synchronized void ensureCapacity(int minimumCapacity) {
        super.ensureCapacity(minimumCapacity);
    }

    /**
     * @since      1.5
     */
    @Override
    public synchronized void trimToSize() {
        super.trimToSize();
    }

    /**
     * @throws IndexOutOfBoundsException {@inheritDoc}
     * @see        #length()
     */
    @Override
    public synchronized void setLength(int newLength) {
        toStringCache = null;
        super.setLength(newLength);
    }

而StringBuilder和StringBuffer的主要区别就是StringBuilder是没有加synchronize同步的,速度比StringBuffer快。

缺点就是 StringBuilder不是线程安全的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值