StringBuilder类
我们已经知道String支持 + 和 +=,在实际使用中,如果多次出现这种写法,会比较浪费时间,因此编译器会对其进行优化,这是通过StringBuilder实现的
用途
StringBuilder是专门用于构造字符串的,创建以后里面的内容是可变的。我们可以使用它来对字符串进行拼接、裁剪等操作,它就像一个字符串编辑器,弥补了字符串不能修改的不足
定义
StringBuilder builder1 = new StringBuilder(); //一开始创建时为null
StringBuilder builder2 = new StringBuilder("abc");
使用
append!
在字符串后面添加字符串,类似于C中的push_back
StringBuilder builder = new StringBuilder();
builder.append("Hello");
delete
删除范围内的字符串 (int start , int end)这里指的都是下标
deleteCharAt
删除某个下标对应字符
insert
在某个下标对应的位置前面插入一个字符(串)
reverse!
对字符串进行翻转
toString
将StringBuilder变回String
此外,该类中也支持String类中的所有方法,这是因为编译器执行了toString方法,将StringBuilder类转换为了String类
链式调用
StringBuilder类支持链式调用(类似于C中的cout<<”dwa”<<a;)
当我们在调用一个方法时,不需要用变量接收它的结果,可以继续调用其他方法
概念
链式调用的基本结构是,一个方法返回对象本身,这样你就可以在这行代码之后继续调用该对象的其他方法,式调用的实现依赖于每个方法返回对象自身(this),这样可以在一个语句中连续调用多个方法。
因此,可以有这种写法:
StringBuilder builder = new StringBuilder();
builder.append("Hello").append(" World");
字符串拼接的底层原理
- 拼接的时候没有变量,都是字符串
此时会触发字符串的优化机制,在编译的时候就已经是最终的结果了
String str = "a" + "b" + "c";
- 拼接的时候有变量参与
JDK8以前会使用StringBuilder
- 源码分析
- 默认创建一个长度(capacity)为16的字节数组
- 添加的内容长度(length)小于16,直接存
- 添加的内容大于16会扩容(16*2+2 = 34)
- 如果扩容之后还不够(>34),以实际长度为准