為什麼 Java 8 中不再需要 StringBuilder 拼接字串
本文由碼農網 – 孫騰浩原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
在Java開發者中,字串的拼接佔用資源高往往是熱議的話題.
讓我們深入討論一下為什麼會佔用高資源。
在Java中,字串物件是不可變的,意思是它一旦建立,你就無法再改變它。所以在我們拼接字串的時候,建立了一個新的字串,舊的被垃圾回收器所標記。
如果我們處理上百萬的字串,然後,我們就會生成百萬的額外字串被垃圾回收器處理。
虛擬機器底層在拼接字串時執行了眾多操作。拼接字串最直接的點操作(dot operator)就是String#concat(String)操作。
public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen); str.getChars(buf, len); return new String(buf, true); }
public static char[] copyOf(char[] original, int newLength) { char[] copy = new char[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
void getChars(char dst[], int dstBegin) { System.arraycopy(value, 0, dst, dstBegin, value.length); }
你可以看到一個字元陣列被建立,長度則是已有字元和拼接的字元長度之和。然後,它們的值複製到新的字元陣列中。最後,用這個字元陣列建立一個String物件並返回。
所以這些操作繁多,如果你計算一下,會發現是O(n^2)的複雜度。
為了解決這個問題,我們使用StringBuilder類。它就像可變的String類。拼接方法幫助我們避免不必要的複製。它擁有O(n)的複雜度,遠遠優於O(n^2)。
然而Java 8預設使用StringBuilder拼接字串。
Java 8的文件說明:
為了提高字字串拼接的效能,Java編譯器可以使用StringBuffer類或類似技術,在使用求值表示式時,減少中間String物件的建立。
Java編譯器處理這種情況:
public class StringConcatenateDemo { public static void main(String[] args) { String str = "Hello "; str += "world"; } }
上面的程式碼會被編譯成如下位元組碼:
public class StringConcatenateDemo { public StringConcatenateDemo(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2 // String Hello 2: astore_1 3: new #3 // class java/lang/StringBuilder 6: dup 7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V 10: aload_1 11: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 14: ldc #6 // String world 16: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 19: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 22: astore_1 23: return }
你可以在這些位元組碼中看到,使用了StringBuilder。所以我們在Java 8中不再需要使用StringBuilder類。
譯文連結:http://www.codeceo.com/article/why-java8-not-use-stringbuilder.html
英文原文:We Don't Need StringBuilder for Concatenation Anymore
翻譯作者:碼農網 – 孫騰浩
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- Java 8中字串拼接新姿勢:StringJoinerJava字串
- String/StringBuilder字串拼接操作UI字串
- 為什麼idea建議使用“+”拼接字串Idea字串
- 為什麼Go不再需要Java風格的GC?- itnextGoJavaGC
- 深入分析Java使用+和StringBuilder進行字串拼接的差異JavaUI字串
- 為什麼創業公司不再需要後端工程師?創業後端工程師
- 為什麼不建議在for迴圈中使用"+"進行字串拼接字串
- 【Java面試】什麼是 ISR,為什麼需要引入 ISRJava面試
- 為什麼Java字串是不可變物件?Java字串物件
- Java開發為什麼需要UML (轉)Java
- 不再怕面試被考字串---詳解Java中的字串面試字串Java
- 羞,Java 字串拼接竟然有這麼多姿勢Java字串
- java 中為什麼重寫 equals 後需要重寫 hashCodeJava
- python怎麼拼接字串Python字串
- 為什麼Java需要物件的序列化Java物件
- 為什麼?為什麼StringBuilder是執行緒不安全的?UI執行緒
- 我為什麼不再推薦RxJavaRxJava
- 【React】為什麼我不再使用setState?React
- 為什麼我不再用 .NET 框架框架
- 為什麼我不再使用MVC框架?MVC框架
- Java 字串比較、拼接問題Java字串
- Java字串拼接寫法 joiner.onJava字串
- Java中Switch支援String字串?為什麼不支援long型別?Java字串型別
- 為什麼需要Docker?Docker
- 為什麼在js中需要新增addEventListener()?JSdev
- 儲存過程中拼接字串儲存過程字串
- java內部類,為什麼需要內部類?Java
- 面試官:為什麼需要Java記憶體模型?面試Java記憶體模型
- 為什麼我不再做.NET開發
- 為什麼阿里巴巴不建議在for迴圈中使用"+"進行字串拼接阿里字串
- 為什麼阿里巴巴不建議在for迴圈中使用”+”進行字串拼接阿里字串
- Java程式碼中字串拼接方式分析Java字串
- Java中常見字串拼接九種方式Java字串
- 為什麼bootstrap不再那麼受歡迎了?boot
- 用了這麼多年分頁PageHelper,為什麼有人說Java開發不再吃香Java
- 為什麼 JVM 需要 GCJVMGC
- python 中為什麼不需要過載Python
- Elasticsearch:是什麼?你為什麼需要他?Elasticsearch