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