Java源码分析---StringBuilder类(JDK14)

StringBuilder

在阅读 StringBuilder 请先点此阅读其父类 AbsractStringBuilder 的源码,便于理解。因为 StringBuilder 的很多方法是直接调用父类方法实现的。

更多JDK源码分析请点击,持续更新

StringBuilder

  • StringBuilder 继承自 AbstractStringBuilder,实现了 SerializableComparableCharSequence 接口。

  • StringBuilderfinal 修饰,表示不可以被继承。

  • StringBuilder 是线程不安全可变字符序列,但效率高StringBuffer 是线程安全的可变字符序列,但效率低

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuilder>, CharSequence{
    
}

构造方法:

StringBuilder()

默认初始化字符串容量为16。调用父类构造方法 AbstractStringBuilder(int capacity) 实现。

关于注解 @HotSpotIntrinsicCandidate 点此查看详细介绍。

@HotSpotIntrinsicCandidate
public StringBuilder() {
    super(16);
}
StringBuilder(int)

创建一个初始化容量为 capacity 的空字符序列。调用父类构造方法 AbstractStringBuilder(int capacity) 实现。

@HotSpotIntrinsicCandidate
public StringBuilder(int capacity) {
    super(capacity);
}
StringBuilder(String)

创建一个初始化内容为字符串str的字符序列,调用父类构造方法 AbstractStringBuilder(String str) 实现。

@HotSpotIntrinsicCandidate
public StringBuilder(String str) {
    super(str);
}
StringBuilder(CharSequence)

创建一个初始化内容为seq的字符序列,调用父类构造方法 AbstractStringBuilder(CharSequence seq) 实现。

public StringBuilder(CharSequence seq) {
    super(seq);
}
toString()

将字符序列复制一份以String对象返回。注意:是通过拷贝一份新字符串返回,而不是将原字符序列返回。

@Override
@HotSpotIntrinsicCandidate
public String toString() {
    // Create a copy, don't share the array
    return isLatin1() ? StringLatin1.newString(value, 0, count)
                      : StringUTF16.newString(value, 0, count);
}
public static String newString(byte[] val, int index, int len) {
    return new String(Arrays.copyOfRange(val, index, index + len), LATIN1);                     
}
writeObject()

私有方法,将字符序列写入到对象输出流中

private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {   
    s.defaultWriteObject();
    s.writeInt(count);
    char[] val = new char[capacity()];
    if (isLatin1()) {
        StringLatin1.getChars(value, 0, count, val, 0);
    } else {
        StringUTF16.getChars(value, 0, count, val, 0);
    }
    s.writeObject(val);
}
  1. 写入字符序列的长度。
  2. 将字符序列复制到char数组中。
  3. 将char数组val写入到输出流。
readObject()

私有方法,从对象输入流中读取字符序列。

private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { 
    s.defaultReadObject();
    count = s.readInt();
    char[] val = (char[]) s.readObject();
    initBytes(val, 0, val.length);
}
  1. 读取字符序列的长度。
  2. 将字符序列读取到char数组中。
  3. 调用父类 initBytes() 方法将char数组val转换为字节数组,并将该字符序列赋给当前对象。

其他方法

其他 compareTo(StringBuilder)append()系列insert()系列delete()indexOf() 等方法均为调用父类AbstractStringBuilder中的方法实现。 具体请点击参考关于 AbstractStringBuilder 的源码分析。

更多JDK源码分析请点击,持续更新

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值