【Java源码系列】String(四)对比 StringBuilder 的实现

本文探讨了Java中String与StringBuilder的底层结构和性能差异。String是不可变的,每次拼接都会创建新的对象,而StringBuilder则在内部使用可变的字符数组,允许多次拼接,提高效率。此外,还分析了StringBuilder的扩容机制和线程安全性,与StringBuffer的区别在于线程安全的实现导致的效率差异。
摘要由CSDN通过智能技术生成

String 系列:

在前面的三篇文章,我们对 String 底层结构及常用方法的源码进行了分析,本篇我们就来看看 StringBuilder…

StringBuilder原理?为什么拼接效率高于String?

StringBuilder的方法实质上是调用父类AbstractStringBuilder的

abstract class AbstractStringBuilder implements Appendable, CharSequence {
   
    // 实质上也是char[],但他不是final的==>也就是说,在数组空间够大的情况下,一个数组可以存多个字符串
    char[] value;

    // 记录当前容量,扩容的前提
    int count;
}

StringBuilder的append方法实际上就是调用父类AbstractStringBuilder的append方法

public StringBuilder(String str) {
 super(str.length() + 16);
 append(str);
}
public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    // 确保容量够,不够则扩容
    // 扩容机制是2*capcity+2
    ensureCapacityInternal(count + len);
    // 将要append的string拷贝到当前数组,0表示从要拼接的字符串第一位开始拷贝
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

接效率高的原因?

  1. String是final的,一个数组只能给一个字符串使用,所以每拼接一次都要新创建然后拷贝一次数组
  2. StringBuilder虽然底层也是字符数组,但是他不final,即允许在容量充足的情况下,一个数组可以被拼接多次;
    相应的StringBuilder也要有扩容机制

StringBuilder与StringBuffer的区别

StringBuffer线程安全,在append方法前面加上了synchronized,但相对效率就低了

public synchronized StringBuffer append(StringBuffer sb) {
    toStringCache = null;
    super.append(sb);
    return this;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A minor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值