七七八八打印zi

关于StringBuffer的理解

2016-08-07  本文已影响15人  HatiJEAGERJAQUE

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一样重载比较多,但是套路一样。

上一篇下一篇

猜你喜欢

热点阅读