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