关于StringBuffer的理解
StringBuffer的构造器
StringBuffer共有4中构造器,这里博主只讲3种
1.StringBuffer sb1=new StringBuffer();
这里看似没有传入参数,其实StringBuffer会默认传入16进入抽象父类的构造器。看源码:
public StringBuffer() {
super(16);
}
这里插一个话题:java中的字符串关系图
AbstractStringBuilder会开辟16个空间长度的char类型,并将值赋值给value(其内部的一个属性,其实是一个char数组)。看源码:
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
2.StringBuffer sb2=new StringBuffer(int)
这个构造器可以自行初始化长度
3.StringBuffer sb3=new StringBuffer(String str)
这个构造器开辟的char数组长度是默认的长度16+str.length()
之后将str的值append到数组中
StringBuffer的append方法
1.实际的执行由父抽象类AbstractStringBuilder完成
2.会进入父类的ensureCapacityInternal方法,判断当前的char数组空间是否够用,不够则进行扩展,长度变为(原来的数组长度+1)*2。看源码:
3.最终由System.arraycopy执行(本地c语言代码),修饰符是native,Arrays.copy只是一个过渡。看源码:
original:被复制的字符串,即append(str)中的str
0:被复制字符串的起始复制下标
copy:存储复制的字符串,即将original复制到copy中
0:copy的复制起始下标
第四个参数:copy复制结束的下标
StringBuffer的append方法虽然很多,但是无外乎这个执行顺序,遗憾的是System.arraycopy是由c/c++语言函数执行的,java并没有开放,所以看不到。
StringBuffer的insert方法
1.实际的执行还是由父类AbstractStringBuilder完成
2.前面走的路和append一样,也要去判断空间是否够用。
3.举个具体的例子:
StringBuffer sb=new StringBuffer("123456");
sb.insert(4,'a');
4.最终的执行还是System.arraycopy,看源码:
将参数换成具体的值就是:
System.arraycopy("123456",4,"123456",5,2);
将第一个“123456”的下标4开始复制,赋值给第二个“123456”从下标5开始的之后2位,然后返回第二个字符串,结果是“1234556”。
insert和append一样重载比较多,但是套路一样。