StringBudiler源码简单解析

StringBudiler源码

  • 继承关系树
  • 底层实现
  • 默认容量()
  • 特别的添加方法(append)

1、继承关系树

继承自AbstractStringBuilder与StringBuffer同族

2、底层实现

//基本大部分方法都是调用父类的方法,点进父类查看
public StringBuilder() {
    super(16);
}

AbstractStringBuilder.java

 AbstractStringBuilder(int capacity) {
        value = new char[capacity];
  }

底层和String一样使用字符串实现,都是包装类型

有参构造函数长度扩充为len+16;StringBuilder(CharSequence seq) {}同理

public StringBuilder(String str) {
    super(str.length() + 16);
    append(str);
}

3、默认容量

public StringBuilder() {
    super(16);
}

默认容量16

使用有参构造器返回的容量为str.length()+16

public StringBuilder(String str) {
    super(str.length() + 16);
    append(str);
}

4、添加方法

  @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
//调用父类方法

查看父类的方法

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;
}
  1. 如果值为空,使用appendNull()是不是有个疑问,如果需要添加的值为空时不是直接返回当前StringBuilder就行了吗,为什么还要调用一个方法呢?

appendNull()方法

private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = 'n';
    value[c++] = 'u';
    value[c++] = 'l';
    value[c++] = 'l';
    count = c;
    return this;
}
  • 判断容量是否足够,如果不够通过Arrays.copy复制到新的字符串数组中然后将'null'添加到StringBuilder中

回到append(String str)方法

//扩容
ensureCapacityInternal(count + len);
//value为StringBuilder中实际拥有的char[],这里是讲str复制到value也就是StringBuilder里面去
str.getChars(0, len, value, count);
//变更实际长度
count += len;

return this;

append(StringBuffer sb)方法

public AbstractStringBuilder append(StringBuffer sb) {
    
}

来看一下使用append(String str)方法添加一个空字符串

public static void main(String[] args) {
    
            StringBuilder sb = new StringBuilder();
            System.out.println("字符串第一个值:"+sb+"  ; 长度:"+sb.length());
            String str = null;
            sb.append(str);
            System.out.println("修改后:"+sb+"  ; 长度:"+sb.length());
    }
    

测试结果:

字符串第一个值: ; 长度:0
修改后:null ; 长度

至于为什么是添加'null',这里就存疑,有知道的小伙伴可以在评论中回复

转载于:https://www.cnblogs.com/Heliner/p/10524897.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值