![](/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.