String、StringBuilder和StringBuffer的區別和用法
阿新 • • 發佈:2018-11-26
分別使用使用這三種來拼接字串,對比各自損耗的時間:
經過測試:
package com.test; public class Main{ public static void main(String[] args){ testString(); testStringBuffer(); testStringBuilder(); } private static void testStringBuilder() { long begin = System.currentTimeMillis(); StringBuilder str = new StringBuilder(""); for (int i = 0; i < 30000; i++) { str.append(i); } long end = System.currentTimeMillis(); long time = end - begin; System.out.println("-------------StringBuilder效能快--------------"); System.out.println(time); } private static void testStringBuffer() { long begin = System.currentTimeMillis(); StringBuffer str = new StringBuffer(""); for (int i = 0; i < 30000; i++) { str.append(i); } long end = System.currentTimeMillis(); long time = end - begin; System.out.println("------------StringBuffer安全的---------------"); System.out.println(time); } //String 做做字串拼接的時候,效能極低,每次拼接的時候物件改變 public static void testString(){ long begin = System.currentTimeMillis(); String str = ""; /* for (int i = 0; i < 30000; i++) { str += i; }*/ for(Integer i =0; i< 30000; i++){ str += i.toString(); } long end = System.currentTimeMillis(); long time = end - begin; System.out.println("-----------String----------------"); System.out.println(time); } }
結論:以後拼接字串,統統使用StringBuffer/StringBuilder,不要使用String。
String和StringBuilder以及StringBuffer的區別:
StringBuffer和StringBuilder都表示可變的字串,功能方法都是相同的。
唯一的區別(建議使用StringBuilder):
StringBuffer:StringBuffer中的方法都使用synchronized修飾符,表示同步的在多執行緒併發的時候可以保證執行緒安全,保證執行緒安全的時候,效能(速度)較低。
StringBuilder:StringBuilder沒有使用synchronized修飾符,不安全,但效能高。
StringBuilder sb = new StringBuilder ()等價於…new StringBuilder(16)(API可見..) 使用StringBUilder無引數的構造器,在底層建立一個長度為16的char陣列:
char[] value = new char[16];
此時該陣列只能儲存16字元,如果超過了,得自動擴容:
自動擴容(建立長度更大得陣列,再把之前得陣列拷貝到新陣列)
此時效能極低,一般得,我們事先知道大概需要儲存多少字元,在構造器中就應該設定。