實際開發過程當中,一直使用String,對於StringBuffer,StringBuilder瞭解甚少,偶爾遇到這個問題,上網找了找,這裏作下記錄。java
String是final類型,不能被繼承,一旦建立了,就不能被修改,而咱們使用的時候,好比String a = 'abc'; a='efg';實際上又建立了一個對象,這個對象的值爲'efg',而後將這個值保存到以前a的對象中,正式由於多了這個步驟,在進行頻繁賦值操做的時候才致使相對於StringBuffer效率更低。小程序
StringBuffer不是final類型的,因此是可變對象,它的創建是經過new StringBuffer(),對象創建以後,就會在內存中申請一塊空間,初始值爲null,賦值方式是經過.append("xxx")來實現。安全
StringBuilder跟StringBuffer的方法和操做基本上相同,惟一不一樣的是StringBuffer是線程安全的,而StringBuilder是不安全的。app
摘選了網上的一段小程序:測試
public class Test { public static void main(String args[]) { String str = "abc"; StringBuffer sb = new StringBuffer("abc"); Runtime runtime = Runtime.getRuntime(); long start = System.currentTimeMillis(); long startFreememory = runtime.freeMemory(); for (int i = 0; i < 10000; i++) { str += i; //測試StringBuffer時候把註釋打開 //sb.append(i); } long endFreememory = runtime.freeMemory(); long end = System.currentTimeMillis(); System.out.println("操做耗時:" + (end - start) + "ms," + "內存消耗:" + (startFreememory - endFreememory)/1024 + "KB"); } }
測試結果:ui
使用String作10000次向一字符串後添加字符串spa
操做耗時:1666ms,內存消耗:1256KB.net
使用StringBuffer作10000次向一字符串後添加字符串線程
操做耗時:13ms,內存消耗:131KBcode
這個差異還真是挺大的。
關於這塊內容,推薦下面的文章,講的更爲貼切