String之StringBuffer、StringBuilder、String对比说明

1. 简述

关于StringBuffer、StringBuilder、String算是老生常谈的问题,今天抽空整理下部分细节。先大概看下类图,StringBuilder和StringBuilder的继承是完全一致的,当然String本身也是实现Serializable和CharSequence接口的,三者类都是由final修饰的也就是具备final修饰的特性不能被继承。

2. 三者拼接字符串的操作实现

String的拼接很简单直接加号操作即可,这样就会创建的新的String对象分配内存空间。大量的拼接或者循环里面操作字符串不推荐使用加号。

StringBuffer、StringBuilder的拼接是调用的append()方法,同时这个方法是源自于他们的父类AbstractStringBuilder的append() 方法,通过下面append() 方法的源码可以看出,StringBuffer之所以线程安全因为它的方法是由synchronizaed 修饰的同步执行。两者在操作字符串的过程中是统一用的是转字符数组进行拼接操作,这样就避免了新的String对象的创建。

    // StringBuffer 的append方法
    
    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }


    // StringBuilder 的append方法

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

    
    // 父类AbstractStringBuilder 的append方法

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

    public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
        if (srcBegin < 0) {
            throw new StringIndexOutOfBoundsException(srcBegin);
        }
        if (srcEnd > value.length) {
            throw new StringIndexOutOfBoundsException(srcEnd);
        }
        if (srcBegin > srcEnd) {
            throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
        }
        System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
    }

3. 三者区别总结

如有披露或问题欢迎留言或者入群探讨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值