![](/img/trans.png)
[英]Difference between String , StringBuilder & StringBuffer?
[英]What's the difference between StringBuilder and ArrayList<String>?
在一次采訪中,我想用一些子字符串構建一個新的字符串。 我認為ArrayList<String>
與StringBuilder
幾乎相同,但是采訪者說,如果需要處理String,我應該始終使用StringBuilder
。 我認為在它們之間添加/刪除功能的時間復雜度是相同的。
它們根本不是一回事。 StringBuilder
構建一個字符串,而ArrayList<String>
只是- 單獨字符串的數組。 當然,您可以使用String.join("", list)
連接數組的所有字符串,其中第一個參數是要使用的分隔符,但是為什么要走那條路線而不是只使用原來的類呢?旨在完全按照您的意願去做?
這全部歸結為內存消耗。 String
是一個對象,而ArrayList<String>
保存單獨的對象,而StringBuilder
僅保存一個對象。
除非繼續需要添加到列表中的單獨元素,否則應使用StringBuilder。
畢竟,您不能直接從列表的內容中獲取串聯的字符串:您必須將其放入StringBuilder中。
但是在構建子字符串字符串的特定情況下, StringBuilder
提供了一些方法,使您可以在不使用substring
String
的情況下追加String
的部分: append(CharSequence, int, int)
方法是一種優化方法,可以避免創建額外的字符串。
應該提到的是,至少當我寫python時,最好先建立一個列表,然后在末尾使用''.join(theList)
,這基本上是ArrayList<String>
的類似形式。
我對python的了解還不夠,所以不知道為什么這被認為特別好。
StringBuilder具有一個成員函數來返回整個構建的字符串,而在ArrayList中,您必須自己連接這些字符串。
您可以使用兩者來“構建”字符串。 但是, StringBuilder
是一類專門用於通過其append
insert
delete
charAt
等方法構建字符串的類。 ArrayList
是通用集合,缺少大多數此功能。 考慮使用ArrayList
實現以下(人為的示例):
StringBuilder sb = new StringBuilder().append("time: ")
.append(System.currentTimeMillis())
.deleteCharAt(4)
.reverse();
System.err.println(sb); // 3153067310451 emit
除了人機工程學和可讀性之外,還有性能方面的考慮因素,但在瑣碎大小的示例中這些因素基本上無關緊要。
如果最后只需要一個String
,則性能和內存消耗肯定會有所不同。 當你建立一個String
從零件,在良好的情況下,你最終使用StringBuilder
,或者在略差的情況下StringBuffer
,並且在你結束了連接兩個字符串最壞的情況下,然后把它們扔掉,並重復-大量撥款和在這種情況下進行垃圾回收。
JLS12仍然按名稱提到StringBuffer
進行優化(但希望StringBuilder
在內部使用, 類似於類似的技術 ):
實現可以選擇在一個步驟中執行轉換和連接,以避免創建然后丟棄中間
String
對象。 為了提高重復字符串連接的性能,Java編譯器可以使用StringBuffer
類或類似技術來減少通過對表達式求值創建的中間String對象的數量。
在具有List<String>
且稍后在其上使用String.join()
的特定情況下, StringJoiner
包含將要使用的特定StringBuilder
對象。
因此無論如何都會有一個構建器,然后從一開始使用它可能會更有效率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.