簡體   English   中英

StringBuilder和ArrayList有什么區別 <String> ?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM