程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> stringbuilder-為什麼StringBuilder的效率要比String高?

stringbuilder-為什麼StringBuilder的效率要比String高?

編輯:編程解疑
為什麼StringBuilder的效率要比String高?

StringBuilder 中的append方法,很多資料上寫之所以建議使用StringBuilder是因為它可變,不會一直創建對象。可是append方法的源碼卻是每一次都調用了System.arraycopy方法,也就意味著每次執行append都在內存中創建了一個數組對象。既然都與String一樣,每次都創建對象,那麼這效率從何而來的啊?請老師指教

最佳回答:


你說的挺對的,StringBuilder在每次append的時候都會發生System.arrayCopy。給你看個效果,然後再給你分析下:
圖片說明

從上面可以看出,for循環10萬次,最後的結果使用StringBuilder的時間大概是String的千分之一,相差了3個數量級。

為什麼會出現這個情況呢?

第一點:關於每次調用append創建一個char【】的說法:
圖片說明
你看,getChars這個方法,是將當前的String對象,變成char【】,但是這個內容是放到那個value的char【】裡面的,也就是說,
他並不是每次都創建一個char【】對象的。(但是System.arrayCopy這個方法是本地方法,看不到源碼)

第二點:String這種對象,每次都會創建一個對象,你改了一點點也會創建一個新的對象,
但是StringBuilder就不是,他只是替換了char【】某個位置上的那個char而已。

第三點:創建對象多了,垃圾回收就多了,垃圾回收也涉及到一部分時間。

第四點:StringBuilder還有個哥哥,StringBuffer,他兩幾乎雙胞胎。
String與StringBuffer的區別
簡單地說,就是一個變量和常量的關系。StringBuffer對象的內容可以修改;而String對象一旦產生後就不可以被修改,重新賦值其實是兩個對象。
StringBuffer的內部實現方式和String不同,StringBuffer在進行字符串處理時,不生成新的對象,在內存使用上要優於String類。所以在實際使用時,如果經常需要對一個字符串進行修改,例如插入、刪除等操作,使用StringBuffer要更加適合一些。
String:在String類中沒有用來改變已有字符串中的某個字符的方法,由於不能改變一個Java字符串中的某個單獨字符,所以在JDK文檔中稱String類的對象是不可改變的。然而,不可改變的字符串具有一個很大的優點:編譯器可以把字符串設為共享的。
StringBuffer:StringBuffer類屬於一種輔助類,可預先分配指定長度的內存塊建立一個字符串緩沖區。這樣使用StringBuffer類的append方法追加字符 比 String使用 + 操作符添加字符 到 一個已經存在的字符串後面有效率得多。因為使用 + 操作符每一次將字符添加到一個字符串中去時,字符串對象都需要尋找一個新的內存空間來容納更大的字符串,這無凝是一個非常消耗時間的操作。添加多個字符也就意味著要一次又一次的對字符串重新分配內存。使用StringBuffer類就避免了這個問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved