StringBuilder基于jdk1.8的源码分析

说到StringBuilder这个实体类,我们知道这个类所属于的下面的包名以及,类修饰关键词都是跟StringBuffer是一样的

package java.lang;  都是属于在java.lang包名下面的  无需引包操作

//都是用final关键词来修饰类名的,同时继承AbstractStringBulder类的
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

二:构造方法的编写

//无参构造函数
public StringBuilder() {
        super(16);  //默认字节容量大小为16
    }

三:看下append方法的具体实现代码是怎样实现的
append(object obj)方法

//可有看见是没有用Sychronized词来修饰的
@Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));  //这一步与StringBugger是一样实现的
    }

继续往下面看其实都是在父类AbstartctStringBuilder中实现的Appent方法的

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

//这里是对于enusureCacityIntermal方法的解释
private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        if (minimumCapacity - value.length > 0) {
            //这里主要作用的就是新建数组并且是数组赋值给了value变量
            value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity));
        }
    }


//这里是对于getChars方法的解释代码
 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);
        }
     //可以看到是将String类型的数据添加到数组中去的
        System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
    }

对于append方法的重载的代码编写的代码

 @Override
    public StringBuilder append(char[] str) {   //可有看见这里的参数类型为char数组-指代添加的就是char数组
        super.append(str);
        return this;
    }


public AbstractStringBuilder append(char[] str) {
        int len = str.length;
       //这一行代码其实就是数组复制,后面空余的元素就是为null值
        ensureCapacityInternal(count + len);
       //直接将后面的char数组值添加进新建的数组中去
        System.arraycopy(str, 0, value, count, len);
        count += len;
        return this;
    }

发布了51 篇原创文章 · 获赞 0 · 访问量 766

猜你喜欢

转载自blog.csdn.net/a_liuren/article/details/103530116