前天刚好写了个程序测试了一下这两个类的效率,你可以自己看看差别,绝对吓死你:足足相差了几千倍,在操作次数更多时还要离谱。 test.java:import java.util.*; class test { public static void main(String[] args) { long tmpNow = (new Date()).getTime(); String st="";int i; for (i=0;i<10000; i++ ) { st = st +"s"; } System.out.print("string 用时 :\t"); System.out.println( (new Date() ).getTime()-tmpNow ) ; StringBuffer stb= new StringBuffer(); tmpNow = (new Date()).getTime(); for (i=0;i<10000; i++ ) { stb.append("s"); } System.out.print("StringBuffer 用时:\t"); System.out.println( (new Date() ).getTime()-tmpNow ) ; } }
String="ddd"+"dfdf";
这是怎么修改的呢?
是系统隐藏地先生成一个stringbuffer类的实例,然后使用append方法,再使用toString()方法将其转换为String类型的。
从而就实现了+号这个功能。
对于String,虽然又重新附了值,但那仅仅是内容改变了,至于这个String对象,并没有改变.可以假设一个String型的变量str,当它创建之后,那么它所对应的地址和它的长度就不再变化,所以说它是不可改变的和不可再操作的
对于StringBuffer,它是指一个存贮字符串的位置,这个位置可以改变,就是说,假如原先分配的长度为16,那么对于String类型,最多存贮16个英文字符,但是对于StringBuffer类型来说,当它存贮的长度要超过16个英文字符时,则它可以重新定义长度,这样,它可以存贮多于16的字符
就这样,是我自己的理解,请大家多多讨论,并欢迎提出不同的观点和意见
test.java:import java.util.*;
class test
{
public static void main(String[] args)
{
long tmpNow = (new Date()).getTime();
String st="";int i;
for (i=0;i<10000; i++ )
{
st = st +"s";
}
System.out.print("string 用时 :\t");
System.out.println( (new Date() ).getTime()-tmpNow ) ; StringBuffer stb= new StringBuffer(); tmpNow = (new Date()).getTime();
for (i=0;i<10000; i++ )
{
stb.append("s");
}
System.out.print("StringBuffer 用时:\t");
System.out.println( (new Date() ).getTime()-tmpNow ) ;
}
}
从重裁的广义去理解