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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,872评论 18 399
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,552评论 0 3
  • 文/晴天 是否 我们在黑夜里 才更渴望光明 为什么? 不在光明里 珍惜?
    草原风的追逐者阅读 165评论 0 1
  • 其实人生有什么意义? 最爱我的人已经不在了 我只是想需要爱 而你们却以为我是个很物质的人 尽管从小到大都缺乏物质 ...
    子衿凌阅读 302评论 0 0
  • 有一位年轻人,看到单一垂直品类小黑裙女装这个蓝海。抛开其他电商渠道,只在公众号上销售,1年做到从0-700万粉丝,...
    走在路上走阅读 1,129评论 0 2