1️⃣类定义
public final class StringBuilder extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
StringBuilder类跟String类一样定义成final形式,主要是为了“效率”和“安全性”的考虑,若StringBuilder 被继承,由于它的高使用率,可能会降低它的性能。
Serializable:主要是进行序列化的;
AbstractStringBuilder: StringBuilder的父类,StringBuilder很多方法都是直接调用的AbstractStringBuilder的(AbstractStringBuilder类里定义了很多方法,在StringBuilder里是直接通过supper.XXX()调用的)
2️⃣构造器
由于StringBuilder里边没有像StringBuffer这样的缓存数组存在,所以我们直接介绍构造器
/**
* 默认调用的是AbstractStringBuilder(int capacity)的构造器,容量为16
*/
public StringBuilder() {
super(16);
}
/**
* 同无参构造器调用的都是AbstractStringBuilder(int capacity)的构造器
* 容量根据传入的capacity决定;
*/
public StringBuilder(int capacity) {
super(capacity);
}
/**
* 调用的是AbstractStringBuilder(int capacity)的构造器,然后在传入字符串长度的
* 基础上在加16进行创建
*/
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
/**
* 调用的是AbstractStringBuilder(int capacity)的构造器,然后在传入的
* CharSequence基础上在加16进行创建
*/
public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
3️⃣方法
StringBuilder的常用方法都是直接调用父类AbstractStringBuilder的,这里仅以reverse为例进行讲解
@Override
public StringBuilder reverse() {
super.reverse();
return this;
}
1 常用的方法基本都是调用的父类的
2 方法声明上相较于StringBuffer少了synchronized修饰符,所以效率比StringBuffer要高;
3 return this是和StringBuffer一样的, 都有这段代码.
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
相较于StringBuffer,StringBuilder少了一个缓存数组toStringCache,所以这里的toString()方法就是直接创建一个String字符串返回而已;
5️⃣总结
1 构造的大小和16相关. 要么是16, 要么就是加16.(除非使用了定制数组大小的那个构造器, 就是指定多大, 初始数组就是多大了.)
2 实现了toString方法. 内部实现就是每次toString都是new一个String对象.
其他方法都是调用的父类的方法. 只是多加了一行return this;
3 方法上少了synchronized修饰符来保证线程安全,所以效率会有所提升.
4 执行效率对比String < StringBuffer < StringBuilder : 由于String每一次创建都是一个不可变长的数组,创建以后如果需要执行其他操作都会在内存中新建一个数组来进行操作,所以效率是最低的;StringBuffer的执行效率高于String的原因是由于StringBuffer是一个可变长的数组来进行存储的,但是他的效率也不是最高的,StringBuilder的效率高于StringBuffer的原因是由于在StringBuffer中的方法都是同步方法,而且都会执行一个缓存的判断,所以三者相比StringBuilder的效率是最高的;
网友评论