- StringBuffer
1、为什么要用StringBuffer?
我们在实际的开发中,如果需要进行字符串的频繁拼接,会造成内存空间的浪费。
因为java中的字符串是不可变的,每一次拼接部会产生新字符串。这样会占用大量的方法区内存。造成内存空间的浪费。
2、StringBuffer底层实际上是一个byte[]数组。
往StringBuffer中放字符串,实际上是放到byte数组当中了。StringBuffer的初始化容量是16。
3、如何优化StringBuffer的性能?
在创建StringBuffer的时候尽可能给定一个初始化容量。最好减少底层数组的扩容次数。给一个合适的初始化容量。可以提高程序的执行效率。(预估计一下,给一个大一些初始化容量)
4、代码示例:
public class Demo{
public static void main(String[] args) {
/*默认创建一个初始化容量为16的byte[]数组。
(字符串缓冲区对象)
加个50就指定了初始化容量*/
StringBuffer stringBuffer = new StringBuffer(50);
//拼接字符串,以后拼接宇符串统一调用append()方法。
stringBuffer.append(3.14);
stringBuffer.append("a");
stringBuffer.append(011);
stringBuffer.append(true);
/*append方法底层在进行追加的时候,
如果byte数组满了,会自动扩容。*/
System.out.println(stringBuffer);
//输出:a3.149true
}
}
- StringBuilder
1、StringBuffer和StringBuilder的区别?
StringBuffer中的方法都有: synchronized关键字修饰。表示StringBuffer在多线程环境下运行是安全的。
StringBuilder中的方法都没有: synchronized关键字修饰,表示StringBuilder在多线程环境下运行是不安全的。
2、总之:
StringBuffer是线程安全的。
StringBuilder是非线程安全的。
3、代码示例:
public class Demo{
public static void main(String[] args) {
/*也是默认创建一个初始化容量为16的byte[]数组。*/
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(3.14);
stringBuilder.append("a");
stringBuilder.append(011);
stringBuilder.append(true);
System.out.println(stringBuilder);
//输出:3.14a9true
}
}