今天看了一下子關於String的一類的書,大概瞭解了String,StringBuilder和Stringuffer的區別。下面我就來淺談一下關於這三部分的差異。安全
public class Test { int loopCount = 10000; // 執行添加操做10000次 public static void main(String[] args) { Test test = new Test(); test.testString(); test.testStringBuffer(); test.testStringBuilder(); } private void testString() { long startTime = System.nanoTime();// 得到當前系統最準確的計時器,以毫微秒爲計時單位 String temp = ""; for (int i = 0; i < loopCount; i++) { temp += i; } long endTime = System.nanoTime(); System.out.println("String運行時間: " + (endTime - startTime)); } private void testStringBuffer() { long startTime = System.nanoTime();// 得到當前系統最準確的計時器,以毫微秒爲計時單位 StringBuffer temp = new StringBuffer(""); for (int i = 0; i < loopCount; i++) { temp.append(i); } long endTime = System.nanoTime(); System.out.println("StringBuffer運行時間: " + (endTime - startTime)); } private void testStringBuilder() { long startTime = System.nanoTime();// 得到當前系統最準確的計時器,以毫微秒爲計時單位 StringBuilder temp = new StringBuilder(""); for (int i = 0; i < loopCount; i++) { temp.append(i); } long endTime = System.nanoTime(); System.out.println("StringBuilder運行時間: " + (endTime - startTime)); } }
首先,運行這三個String差異,能夠看出時間上差別很大app
String運行時間: 606270951
StringBuffer運行時間: 1167296
StringBuilder運行時間: 746880
Process finished with exit code 0
ide
String作字符串的拼接中函數
String是一個不可變的線程安全的一個函數,關於字符串拼接,其調用oop
/** The value is used for character storage. */ private final char value[];
因爲final是一個不可變的,因此每一次的調用,都須要建立一個新的對象。
ui
String new=「this」+「is」+「a day「;this
這樣的拼接方式,編譯器直接給你拼接爲this is a day 實際上就是調用了Stringbuffer直接拼接而成,因此時間和StringBuffer其實差很少。可是若是是String str1="this",String str2="is";String str3="a day";String str=str1+str2+str3;這種形式的話,就是真實的按照String拼接。String的拼接,因爲使用final做爲不可變參數,因此線程安全。線程
而StringBuffer,因爲須要字符串的拼接,因此有一些獨特的用於拼接字符串的方法。code
@Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this; } @Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
/** * @throws StringIndexOutOfBoundsException {@inheritDoc} * @since 1.2 */ @Override public synchronized StringBuffer delete(int start, int end) { toStringCache = null; super.delete(start, end); return this; }
這些方法,是用來作字符串拼接有關,咱們能夠見到synchronized,其中全部的方法都給加了鎖,因此這個方法也是線程安全的。對象
private transient char[] toStringCache;
關於字符串拼接,因爲不是不可變的,因此速度會快。
另外一個的話,和StringBuffer差很少,可是線程不安全。
關於StringBuffer和StringBuilder他們共同繼承了
AbstractStringBuilder
和序列化
public AbstractStringBuilder append(char[] str) { int len = str.length; ensureCapacityInternal(count + len); System.arraycopy(str, 0, value, count, len); count += len; return this; }
這一部分是字符串拼接部分