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有所微小損耗。 |