首先阐述String类和StringBuffer类的区别,String类是常量,不能添加,而StringBuffer则是一个字符缓冲区,可以往里面添加字符串。比如说:
<span style="font-size:18px;">String str = "helloworld"; str += "welcome";</span>
这里其实过程是这样的:生成了String对象 "helloworld" 引用由str持有, 当执行 str += "welcome" ; 这行代码的时候其实是废弃了 原来的 "helloworld"对象 然后产生了新的拼接之后的对象,然后把引用赋给了str。 所以过程中又生成了新的String类型的对象,然后原来的对象就要被垃圾回收器回收。肯定是要影响程序的性能。
那么,我们现在再来看一看StringBuffer的做法
<span style="font-size:18px;">StringBuffer sb = new StringBuffer("helloworld"); sb.append("welcome");</span>
StringBuffer的过程是这样的。首先构造出一个StringBuffer对象,在缓冲区中,让后可以在缓冲区中直接添加指定的字符串序列。
还有一种写法肯定是错的 :
StringBuffer sb = new StringBuffer();
sb = "helloworld"; //字符串对象怎么能赋给StringBuffer对象呢?
然后下面的测试String 类和StringBuffer类的性能测试代码段
执行效果不绝对,因每一台机子的硬件配置而定。
首先是String类的性能
<span style="font-size:18px;">/* 本代码段测试String类的性能 约2854毫秒 String tempValue = "helloworld"; int times = 10000; String value = ""; long startTime = System.currentTimeMillis(); for(int i = 0 ;i < times ; i++) { value += tempValue; } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime); */</span>
然后是StringBuffer类
<span style="font-size:18px;">/* 本代码段用于测试StringBuffer类的性能 约为10毫秒 String tempValue = "helloworld"; int times = 10000; StringBuffer sb = new StringBuffer(); long startTime = System.currentTimeMillis(); for(int i = 0 ; i < times ; i++) { sb.append(tempValue); } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime); */</span>
在一个就是StringBuilder 和StringBuffer类的比较
怎么说的StringBuilder类是从JDK5.0开始出现的类。用来替代StringBuffer 。但是不保证线程安全。如果你需要这种同步,请使用StringBuffer类,StringBuilder类是线程不安全的。而StringBuffer是线程安全的。
性能上来说StringBuilder是比StringBuffer的性能要强那么一点点,但是两个类总体上的使用方法是差不多的。
一下是测试StringBuilder类的性能的测试代码段。
<span style="font-size:18px;">/* 本代码段用于测试 StringBuilder类的性能 约10毫秒 String tempValue = "helloworld"; int times = 10000; StringBuilder sb = new StringBuilder(); long startTime = System.currentTimeMillis(); for(int i = 0 ; i < times ; i++) { sb.append(tempValue); } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime); */</span>
综上所述:如果你使用的是常量的要多一些,还请使用String类 ,如果经常改变值,还请使用StringBuffer 或StringBuilder。
一般来说性能上 StringBuilder > StringBuffer > String