思考:我们在实际开发中,如果需要进行字符串的频繁拼接,会有什么问题?
String s = "abc";
、s += "hello";
这两行代码,就导致在方法区字符串常量池当中创建了3个对象。分别是:"abc"
、"hello"
、"abchello"
public class StringBufferTest01 {
public static void main(String[] args) {
String s="";
// 这样做会给java的方法区字符串常量池带来很大压力。
for (int i = 0; i < 100; i++) {
s+=i;
System.out.println(s);
}
}
}
java.lang.StringBuffer
java.lang.StringBuilder
StringBuffer
底层实际上是一个byte[]
数组,往StringBuffer
中放字符串,实际上是放到byte[]
数组中了。StringBuffer
的初始化容量是16。public class StringBufferTest02 {
public static void main(String[] args) {
// 创建一个初始化容量为16个byte[]数组。(字符串缓冲区对象)
StringBuffer stringBuffer = new StringBuffer();
// 拼接字符串,以后拼接字符串统一调用append()方法
// append是追加的意思
stringBuffer.append("a");
stringBuffer.append("b");
stringBuffer.append("c");
stringBuffer.append(3.14);
stringBuffer.append(true);
// append()方法底层在追加的时候,如果byte数组满了,会自动扩容。
stringBuffer.append(100L);
System.out.println(stringBuffer.toString());
}
}
如何优化StringBuffer
的性能?
StringBuffer
的时候尽可能给定一个初始化容量。最好减少底层数组的扩容次数。预估计一下,给一个大一些的初始化数组。public class StringBufferTest02 {
public static void main(String[] args) {
// 指定初始化容量的StringBuffer对象(字符串缓冲区对象)
StringBuffer sb = new StringBuffer(100);
sb.append("hello");
sb.append("world");
sb.append("hello");
sb.append("jack");
sb.append("hello");
System.out.println(sb);
System.out.println(sb.toString());
}
}
StringBuffer
和StringBuilder
的区别
StringBuffer
中的方法有:synchronized关键字
修饰。表示StringBuffer
在多线程环境下运行是安全的。StringBuilder
中的方法没有:synchronized关键字
修饰,表示StringBuilder
在多线程环境下运行是不安全的。StringBuffer
是线程安全的;StringBuilder
是非线程安全的。public class StringBuilderTest01 {
public static void main(String[] args) {
// 使用StringBuilder也可以完成字符串的拼接
StringBuilder sb = new StringBuilder();
sb.append(100);
sb.append(true);
sb.append("hello");
sb.append("kitty");
sb.append(3.14);
System.out.println(sb);
}
}
原文:https://www.cnblogs.com/yxc-160206/p/13237519.html