StringBuilder和ArrayList <string>有什么区别?

时间:2018-10-21 15:34:07

标签: java string arraylist stringbuilder

在一次采访中,我想用一些子字符串构建一个新的字符串。我认为splitsArrayList<String>几乎相同,但是面试官说如果需要处理String,我应该始终使用StringBuilder。我认为在它们之间添加/删除功能的时间复杂度是相同的。

6 个答案:

答案 0 :(得分:4)

它们根本不是一回事。 StringBuilder生成一个单个字符串,而ArrayList<String>只是一个-一组单独的字符串。当然,您可以使用String.join("", list)连接数组的所有字符串,其中第一个参数是要使用的分隔符,但是为什么要走那条路线而不是只使用设计用于<

答案 1 :(得分:1)

这全部归结为内存消耗。 String是一个对象,而ArrayList<String>是单独的对象,StringBuilder仅是一个对象。

答案 2 :(得分:0)

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

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

但是在构建字符串 substrings 的特定情况下,StringBuilder提供了一些方法,使您无需使用String即可附加substring的部分内容:append(CharSequence, int, int)方法是一种优化方法,可避免创建额外的字符串。


应该提到的是,至少当我编写python时,最好先建立一个列表,然后在最后使用''.join(theList),这基本上是{{1}的类似形式}。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以使用两者来“构建”字符串。但是,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
除了人机工程学和可读性之外,还有一些性能方面的考虑因素,但这些因素在平凡大小的示例中根本无关紧要。

答案 5 :(得分:0)

如果最后只需要一个String,则性能和内存消耗肯定会有所不同。每当您从各个部分构建String时,在好的情况下,您最终都会使用StringBuilder,或者在稍差的情况下,您会使用StringBuffer,在最坏的情况下,您最终会连接两个字符串,然后将其丢弃,然后重复-在这种情况下,将进行大量分配和垃圾回收。

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

  

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

在具有List<String>且稍后在其上使用String.join()的特定情况下,StringJoiner包含将要使用的特定StringBuilder对象。
因此无论如何都会有一个构建器,然后从一开始使用它可能会更有效率。