使用StringBuffer字符串拼接目的就是为了让字符串占用的内存空间减少,提高效率
思考:我们在实际的开发中,如果需要进行字符串的频繁拼接,会有什么问题?
答案:
因为java中的字符串是不可变的,每一次拼接都会产生新的字符串,这样会占用大量的方法区内存,造成内存空间的浪费
底层分析:
代码演示:
public class StringTest05 {public static void main(String[] args) {String s="abc";s+="hello";System.out.println(s);//以后要进行大量字符串操作的时候,尽量用JDK自带的StringBuffer//创建一个初始化容量为16个byte[]数组,也叫做字符串缓冲区对象
//50是初始的容量大小为50,不是16了,默认情况才是16StringBuffer stringBuffer=new StringBuffer(50);//以后拼接字符串,统一调用append()方法进行追加stringBuffer.append("a");stringBuffer.append("b");stringBuffer.append(3.15);System.out.println(stringBuffer);}
}
管中窥豹:
在String类中底层代码其实是字符类型的数组char[] ,另外,用final修饰,也就意味着,String在直接创建的时候,根据其底层是final修饰的数组这个前提下,我们得知,一旦创建,其长度和内存地址不会发生改变
管中窥豹:
StringBuffer中是创建一个16个空间的字符数组
底层调用的是数组的拷贝
画图分析:(使用String直接创建字符串和使用StringBuffer追加字符串的不同)
String是写死容量,你创建多少就使用多少
StirngBuffer是动态容量,你创建的初始空间是16个字符,后续如果超过此数据后,会创建一个更大的数组存储,那么之前存储的数据首先会拷贝进新的数组内,旧的数组会有垃圾回收机制回收
如何优化StringBuffer的性能:
在创建StringBuffer的时候尽可能给定一个初始化容量
最好减少底层数组的扩容次数,预估计以下,给一个足够你创建样本数据的初始化容量