java中对字符串的修改操做能够说是很是常见的,若是涉及到频繁的字符串修改操做,常常被建议采用StringBuilder和StringBuffer,确定不用String类,缘由在于 StringBuilder和StringBuffer不是final修饰的,它们是可变的,而String是不可变化的,所以每次对String对象进行修改操做都是经过拷贝复制String对象而后进行操做,性能上天然大打折扣。java
而StringBuilder和StringBuffer,它门都不是final的,运行频繁在原对象上进行修改。确定有人会问,StringBuilder和StringBuffer有什么区别呢?就一句话,StringBuffer和StringBuilder的方法基本上是同样的,惟一的区别是StringBuffer是线程安全的,而StringBuilder不是。安全
这里写一个程序分别用String、StringBuilder和StringBuffer,三种对象方法来对字符串添加的操做。看看分别耗时多少,上一段提到StringBuilder不是线程安全,StringBuffer是线程安全,这里咱们暂时无论线程安全性。线程安全,意味着有代价,那就是要慢一些。下面的例子,能够证实三种类对字符串添加操做的速度快慢对比。app
public class StringEntities { private static final int COUNTS = 10000; /*** * 测试String复制添加操做时间 */ public static void testString(){ System.out.print("Start to test String -> "); long startTime = System.currentTimeMillis(); String strResult = ""; for(int i = 0; i< COUNTS; i++){ strResult += i; } long endTime = System.currentTimeMillis(); // 统计循环整个过程时间 System.out.println("Total time of String operation i: "+ (endTime - startTime)); } /** * 测试StringBuffer复制添加操做时间 */ public static void testStringBuffer(){ System.out.print("Start to test StringBuffer -> "); long startTime = System.currentTimeMillis(); StringBuffer strResult = new StringBuffer(); for(int i = 0; i< COUNTS; i++){ strResult.append(i); } long endTime = System.currentTimeMillis(); // 统计循环整个过程时间 System.out.println("Total time of StringBuffer operation is: "+ (endTime - startTime)); } /** * 测试StringBuffer复制添加操做时间 */ public static void testStringBuilder(){ System.out.print("Start to test StringBuilder -> "); long startTime = System.currentTimeMillis(); StringBuilder strResult = new StringBuilder(); for(int i = 0; i< COUNTS; i++){ strResult.append(i); } long endTime = System.currentTimeMillis(); // 统计循环整个过程时间 System.out.println("Total time of StringBuilder operation is:: "+ (endTime - startTime)); } } public class Main { public static void main(String[] args) { StringEntities.testString(); StringEntities.testStringBuffer(); StringEntities.testStringBuilder(); } }
结论就是,从操做效率来看:StringBuilder > StringBuffer > String。 StringBuffer相对线程安全,所以在性能上相比StringBuilder有所微小损耗。 |