一、使用场景:
我们在实际开发中,每一次字符串拼接会产生新的字符串,频繁的字符串拼接会占用大量的方法区中字符串常量池内存,造成空间浪费。(详见文章java String类中 一 的内容)
二、StringBuffer类:
- 1.如果需要进行大量字符串拼接操作,建议使用JDK中自带的:
java.lang.StringBuffer
java.lang.StringBuilder - 2.如何优化StringBuffer?
(1)StringBuffer初始化容量为16个bytes[]字符串缓冲区数组。
(2)在创建StringBuffer的时候尽可能给定一个合适的初始化容量,减少程序自动扩容次数,可以提高程序执行效率。 - 3.原理:
StringBuffer创建后会生成一个临时的byte[]数组,为字符串缓冲区数,每次append()拼接字符串都会占用一个数组空间,拼接结束后,调用toString()方法生成String对象,系统会自动释放该字符串缓冲区,相比于用“‘+”进行拼接节省了很多的空间,提高了效率。
import java.lang.StringBuffer;
public class Test {
public static void main(String[] args) {
//默认容量为16
StringBuffer stringbuffer = new StringBuffer(50);//给定一个合适的容量
//拼接字符串统一调用append()方法
stringbuffer.append(100);
stringbuffer.append("abcd");
stringbuffer.append(true);
stringbuffer.append(100l);
stringbuffer.append(3.1415926);
//append()进行拼接的时候如果数组满了会自动扩容,但是扩容会降低效率
String s= stringbuffer.toString();
System.out.println(s);
}
}
结果是:100abcdtrue1003.1415926
三、StringBuffer类和StringBuilder类区别:
-
1.StringBuffer类中的方法都有synchronized关键字修饰,表示StringBuffer在多线程环境下运行是安全的。
StringBuilder类中的方法没有synchronized关键字修饰,表示StringBuilder在多线程环境下运行是不安全的。 -
2.StringBuilder效率更高。
-
3.使用原则:
操作少量的数据,用String 。
单线程操作大量数据,用StringBuilder 。
多线程操作大量数据,用StringBuffer。