1.意义
从现象看本质。在Java中,当需要大量进行字符串拼接时,频繁使用“+”进行拼接是不合理的,因为每用“+”拼接一次,它并不是简简单单的在前面的基础上进行扩容,而是不断的通过创建新的对象去存储字符串,这样导致的结果是使得方法区的内存被极大地消耗。
String s="";
for(int i=0;i<101;i++){
s=s+i;
}
System.out.println(s);
试着用图解的方式在方法区中表示出,创建了多少对象?
答案是101个;天啊!这得多消耗方法区内存!!!
有没有什么办法去解决或者说是缓冲这一现象?很人性的是,答案是有,就是通过Java.lang包下的StringBuffer类去解决这一尴尬问题。
2.StringBuffer的简要原理
往最简洁了说,StringBuffer类是从创建对象这个过程转移到了通过数组进行缓存(这跟数据结构中栈缓存是有着异曲同工之妙的)。在StringBuffer类的源码中,可以看到字符串直接被转化为了byte[]数组。
String.valueOf(stringBuffer).getBytes()
至此,我们可以模糊地知道:哦,原来StringBuffer可以用来创建字符串的缓冲区对象啊!
3.StringBuffer的简单使用方法
(1)构造方法
StringBuffer sb=new StringBuffer();
StringBuffer sb1=new StringBuffer(10);
StringBuffer sb2=new StringBuffer("str");
通过new了3个StringBuffer类的实例对象sb、sb1、sb2,可以看出,有多个构造方法。对于sb,它表示没有存储任何字符串,默认长度为16的缓冲区;对于sb1,表示没有存储任何字符串,长度设定为10;对于sb2,表示以“str”字符串为开端进行存储。三者根据开发者的需求去进行选择。
(2)一个常用方法:扩容 append()
StringBuffer sb = new StringBuffer();
sb.append("#@!246$#!");
sb.append("");
sb.append("SiDevLg ");
sb.append("179,123456,9,33:44:44:55:66:77,0 ");
sb.append(" ");
sb.append("!@#V3");
System.out.println(sb);
扩容顾名思义,便是在原有的字符串基础上进行扩充。通过查看append源码可发现,该方法调用了Arrays中的copyOf方法,即数组拷贝。说到这,大家应该顿时豁然开朗了。当然,扩充也是占资源的,能少扩充当然就尽可能少的去用。
(3)StringBuffer的性能优化
在面试中,经常会被问到:如何对StringBuffer类的使用进行优化呢?
该回答得当,至少会被认为Java中,你已经有了较深入的研究了。
问题答案很简单:
1.创建对象时,最好先给StringBuffer设定一个缓冲区长度值。
2.设定的长度尽可能够用,适当,避免后续扩充次数的过度使用。



