在一次采访中,我想用一些子字符串构建一个新的字符串。我认为splits
与ArrayList<String>
几乎相同,但是面试官说如果需要处理String,我应该始终使用StringBuilder
。我认为在它们之间添加/删除功能的时间复杂度是相同的。
答案 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
对象。
因此无论如何都会有一个构建器,然后从一开始使用它可能会更有效率。