解析java中的StringBuffer和StringBuilder

解析java中的StringBuffer和StringBuilder

1 StringBuffer

1.1 核心

a 线程安全

b. 速度相对于StringBuilder慢

c. 自动扩容(本质还是新开辟一个新的数组(把value的指向改成了这个新的数组))

1.2 常用方法(改变的都是自身)

1.2.1 字符串拼接append
a 语法
StringBuffer对象名.append(CharSequence s);
//这个CharSequence是String类实现的接口,里面可以传入String对象
//本质还是多态的一种体现
b 示例代码
package Work;
public class Test05 {
    public static void main(String[] args) {
      StringBuffer stringBuffer=new StringBuffer("abc");
      //此时stringBuffer对象的初始空间为传入字符串长度+16,改的还是自身的空间,append里面的参数也可以是任意类型
      stringBuffer.append(100);
      System.out.println(stringBuffer);
    }
}

c 示例代码运行截图

在这里插入图片描述

1.2.2 字符串反转reverse
a 语法
StringBuffer对象名.reverse();
b 示例代码
package Work;
public class Test05 {
    public static void main(String[] args) {
      StringBuffer stringBuffer=new StringBuffer("abc");
      //此时stringBuffer对象的初始空间为传入字符串长度+16,改的还是自身的空间,append里面的参数也可以是任意类型
      stringBuffer.reverse();
      //StringBuffer方法的所有方法都是会去对自己操作,会修改自己
      System.out.println(stringBuffer);
    }
}

c 示例代码运行截图

在这里插入图片描述

1.2.3 字符串插入insert
a 语法
StringBuffer对象名.insert(int offSet,插入元素);
//插入元素可以是任意类型,offSet为插入的位置,这样原来的offSet以及其后的元素都会往后移动一格
b 示例代码
package Work;
public class Test05 {
    public static void main(String[] args) {
      StringBuffer stringBuffer=new StringBuffer("abc");
      //此时stringBuffer对象的初始空间为传入字符串长度+16,改的还是自身的空间,append里面的参数也可以是任意类型
      stringBuffer.insert(0,100);
      System.out.println(stringBuffer);
    }
}

c 示例代码运行截图

在这里插入图片描述

1.2.4 无参构造
a.语法
StringBuffer stringBuffer=new StringBuffer();
b 示例代码
package Work;
public class Test05 {
    public static void main(String[] args) {
     //创建一个StringBuffer对象,底层的数组长度为16,如果是JDK1.8,那么底层就是char数组,如果是JDK13,那么底层为byte类型的数组
      StringBuffer stringBuffer=new StringBuffer();
    }
}

c 底层源码显示(JDK1.8为例子)

在这里插入图片描述

在这里插入图片描述

1.2.3 有参构造(参数为数组容量)
a 语法
StringBuffer stringBuffer=new StringBuffer(底层数组容量);
b 示例代码
package Work;
public class Test05 {
    public static void main(String[] args) {
     //创建一个StringBuffer对象,底层的数组长度为16,如果是JDK1.8,那么底层就是char数组,如果是JDK13,那么底层为byte类型的数组
      //给多少数字,那底层的数组长度就为多少  
      StringBuffer stringBuffer=new StringBuffer(32);
      //此时stringBuffer的底层数组长度为32
    }
}

c 底层源码显示

在这里插入图片描述

1.2.4 有参构造(参数为传进去的字符串)
a 语法
StringBuffer stringBuffer=new StringBuffer(CharSequence seq);
//这个字符序列实际上可以传入任意字符串,因为String类实现了CharSequence接口
//只不过是多态的一种体现罢了
//得到的底层数组长度=传入的字符串长度+16;
b 示例代码
package Work;
public class Test05 {
    public static void main(String[] args) {
     //创建一个StringBuffer对象,底层的数组长度为16,如果是JDK1.8,那么底层就是char数组,如果是JDK13,那么底层为byte类型的数组
      StringBuffer stringBuffer=new StringBuffer("abc");
      //此时stringBuffer的底层数组长度为3+16=19
    }
}

c 示例代码运行截图

在这里插入图片描述

2 StringBuilder

2.1 核心

a 线程不安全

b. 速度相对于StringBuffer快

c. 自动扩容(本质还是新开辟一个新的数组(把value的指向改成了这个新的数组))

2.2 常用方法

与StringBuffer拥有的方法的使用方式差不多,这里就不赘述了

3 常用问题

3.1 字符串拼接我们有+、concat、append这三种,我们应该使用哪种呢?

对于使用很少的固定不变的量,就使用+

对于需要频繁拼接的操作,建议用StringBuffer中的append操作,不要用concat

因为concat能实现的功能append不仅能实现,而且更省空间(StringBuffer只要没有超过容量都不用去开辟新的数组空间)

3.2 如何提高使用StringBuffer的效率

解答:预估容量(把底层的数组按照这个长度来),这样就能减少自动扩容的次数(每扩容一次,都会开辟一个新的数组空间,然后还会把原数组的值依次放入新数组中,这些操作都是需要耗费时间的)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值