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;
}
- 如果值为空,使用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',这里就存疑,有知道的小伙伴可以在评论中回复
内容来自博客园,拒绝爬虫网站