Android StringBuilder 和 String 连接的区别

17
我正在阅读这个文档页面:http://developer.android.com/reference/android/util/Log.html,其中这个部分引起了我的注意:

提示:不要忘记,当您进行以下调用时:

Log.v(TAG, "index=" + i);

在构建传递给 Log.d 的字符串时,编译器使用一个 StringBuilder 并至少发生三次分配:StringBuilder 本身、缓冲区和 String 对象。现实情况是还有另一个缓冲区分配和复制,并且垃圾回收器承受更多压力。这意味着,如果您的日志消息被过滤掉,您可能正在做大量工作并产生重大开销。

这意味着 Android 编译器将字符串连接 (+) 转换为 StringBuilder 和 append 语句。 我的假设是否正确,还是手动使用 StringBuilder 比字符串连接更好?

可能重复的问题:在Java中字符串拼接 - 何时使用+,StringBuilder和concat。请参考链接 - givanse
2个回答

11
编译器会执行暗示的操作。您可以打印生成的.class文件的字节码(使用javap -c),并查看构造和使用StringBuilder的调用。
但通常情况下,当字符串连接分散在多行代码中时,手动进行连接是值得的。编译器通常为每个涉及+的字符串表达式分配单独的StringBuilder

1
@JeremyEdwards - 呵呵,我说过很多类似的话。 :) - Ted Hopp
4
如果字符串拼接跨越多行代码,通常手动操作是值得的。我想强调一下@TedHopp所说的,以免失去重点。我曾经在大约10行代码中拼接了一个250个字符的字符串,App Engine上的CPU时间为350毫秒。当我将其替换为单个StringBuilder时,时间减少到50毫秒,其他事情没有改变。 - Oliver Hausler

3
Ted Hopp的答案很好,但我读了几遍才理解。以下是一种重新表述的答案,希望更加清晰明了。
字符串连接(例如使用+,如String myString = "Hello " + "World";)在后台使用StringBuilder和其他分配方式。因此,除了简单的一次连接之外,最好自己使用StringBuilder。
例如:
StringBuilder myString = new StringBuilder();
myString.append("Hello ");
myString.append("to ");
myString.append("everyone ");
myString.append("in ");
myString.append("the ");
myString.append("world!");

比...更好

String myString = "Hello " + "to " + "everyone " + "in " + "the " + "world!";

1
但是如果我的字符串只是'"index=" + i',最好的方法是什么?(为了性能) - GMX
1
@GMX,这是一个好问题,我认为这将取决于上下文。如果只偶尔调用它,则使用"index=" + i比使用StringBuilder更易读。但是,如果在循环内被调用1000次并且性能是一个问题,那么可能某种StringBuilder选项会更好。尽管如此,接受的答案的主要观点是,当构建一个字符串需要多行代码时,一定要使用StringBuilder - Suragch
1
准确地说:在 StringBuilder 版本中,您将需要添加 myString.toString() 以获得正确的字符串。 - Uglylab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接