【问题标题】:What's the difference between StringBuilder and ArrayList<String>?StringBuilder 和 ArrayList<String> 有什么区别?
【发布时间】:2018-10-21 15:34:07
【问题描述】:

在一次采访中,我想用一些子字符串构建一个新的字符串。我认为ArrayList&lt;String&gt;StringBuilder几乎相同,但面试官说如果我需要处理String,我应该总是使用StringBuilder。我认为它们之间添加/删除函数的时间复杂度是相同的。

【问题讨论】:

  • 你得到这份工作了吗?一个更好的问题应该是,“什么时候应该使用StringBuilder,什么时候应该使用List&lt;String&gt;?”

标签: java string arraylist stringbuilder


【解决方案1】:

它们根本不是一回事。 StringBuilder 构建一个 single 字符串,而 ArrayList&lt;String&gt; 只是一个 separate 字符串数组。当然,您可以将数组的所有字符串与String.join("", list) 连接起来,其中第一个参数是您要使用的分隔符,但是为什么要走那条路而不是只使用旨在执行的类 究竟你首先要做什么?

【讨论】:

    【解决方案2】:

    这一切都归结为内存消耗。 String 是一个对象,而ArrayList&lt;String&gt; 保存单独的对象,StringBuilder 只保存一个。

    【讨论】:

      【解决方案3】:

      StringBuilder 有一个成员函数来返回整个构建的字符串,而在 ArrayList 中,您必须自己连接字符串。

      【讨论】:

        【解决方案4】:

        除非您继续需要添加到列表中的单独元素,否则您应该使用 StringBuilder。

        毕竟,您不能直接从列表的内容中获取连接的字符串:您必须将其放入,例如,StringBuilder。

        但在构建 子字符串 字符串的特定情况下,StringBuilder 提供了允许您在不使用 substring 的情况下附加 Strings 的部分的方法:append(CharSequence, int, int) 方法是一种避免创建额外字符串的优化。


        需要提一下,至少在我写过python的时候,已经考虑过最好先建一个list,最后用''.join(theList),基本上就是ArrayList&lt;String&gt;的类比。

        我对 python 的了解还不够,不知道为什么它被认为特别好。

        【讨论】:

          【解决方案5】:

          您可以使用两者来“构建”字符串。然而StringBuilder是一个专门用它的appendinsertdeletecharAt等方法构建字符串的类。 ArrayList 是一个通用的集合,它缺乏大部分功能。考虑使用ArrayList 实现以下(人为的示例):

              StringBuilder sb = new StringBuilder().append("time: ")
                      .append(System.currentTimeMillis())
                      .deleteCharAt(4)
                      .reverse();
          
              System.err.println(sb); // 3153067310451 emit
          

          除了人机工程学和可读性之外,还有性能方面的考虑,但这些与琐碎大小的示例在很大程度上无关。

          【讨论】:

            【解决方案6】:

            如果你最后需要一个String,性能和内存消耗肯定会有一些差异。每当您从零件构建String 时,在好的情况下,您最终会使用StringBuilder,或者在稍差的情况下使用StringBuffer,在最坏的情况下,您最终会连接两个字符串,然后将它们扔掉,然后重复 - 在这种情况下进行大量分配和垃圾回收。

            JLS12 still mentions StringBuffer 按名称进行优化(但希望StringBuilder 在内部使用,作为类似的技术):

            实现可以选择在一个步骤中执行转换和连接,以避免创建然后丢弃中间String 对象。为了提高重复字符串连接的性能,Java 编译器可以使用StringBuffer 类或类似技术来减少通过计算表达式创建的中间字符串对象的数量。

            在具有List&lt;String&gt; 并稍后在其上使用String.join() 的特定情况下,StringJoiner 包含将要使用的特定StringBuilder 对象。
            所以无论如何都会有一个builder,然后从一开始就使用它可能会更有效率。

            【讨论】:

              猜你喜欢
              • 2012-05-26
              • 2015-12-07
              • 2014-07-22
              • 2017-05-08
              • 2017-11-29
              • 1970-01-01
              • 2014-06-29
              • 2011-02-24
              • 2016-11-09
              相关资源
              最近更新 更多