繁体   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