String 和StringBuffer字符串拼接
package com.stringbuffer;
/**
* 思考:在实际的开发中,如果需要频繁拼接字符串,会有什么问题?
*
* 因为java中的字符串是不可变的,每一次拼接都会产生新的字符串,占用大量的方法区内存,造成内存空间的浪费
* String s = "abc";
* s += "hello"
* 以上代码在方法区字符串常量池中创建了3个对象
*
* 如果以后需要字符串的拼接:建议使用JDK自带的:
* java.lang.StringBuffer
* java.lang.StringBuilder
*
* 如何优化StringBuffer的性能
* 在创建StringBuffer的时候尽可能给定一个初始化容量
* 最好减少底层数组的扩容次数,预估一下,给一个大一些的初始化容量
*/
public class Demo01 {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("a");
stringBuffer.append("b");
stringBuffer.append("c");
// 数组长度一旦定了,不可变,数组前没有+final,数组空间满了,会进行数组拷贝,之前的会被垃圾回收
stringBuffer.append(3.14);
stringBuffer.append(true);
System.out.println(stringBuffer.toString());// abc3.14true
}
}
StringBuilder和StringBuffer的区别
package com.stringbuffer;
public class Demo02 {
/*
StringBuffer方法都有 synchronized 修饰,表示StringBuffer在多线程环境下运行时安全的
StringBuilder方法没有 synchronized 修饰,表示StringBuffer在多线程环境下运行时是不安全的
*/
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("a");
stringBuilder.append("b");
stringBuilder.append("c");
System.out.println(stringBuilder.toString());
}
}