2011-12-18 71 views
14

我正在阅读本文档页面,http://developer.android.com/reference/android/util/Log.html。这里Android StringBuilder与字符串串联

本节吸引了我的眼球:

提示:不要忘了,当你喜欢

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

一个电话,当你正在构建的字符串传递到Log.d,编译器 使用一个StringBuilder,并且至少发生三个分配: StringBuilder本身,缓冲区和String对象。 实际上,还有另外一个缓冲区的分配和复制,并且对gc的压力更大。这意味着如果您的日志消息是 被过滤掉了,那么您可能会做大量工作并导致大量开销。

这意味着Android编译器正在进行字符串连接(+)并将它们转换为StringBuilder并附加语句。

我的假设是正确的还是手动使用StringBuilder而不是字符串连接更好?

+0

可能重复的[在Java中字符串连接 - 时使用+,StringBuilder的和的concat(http://stackoverflow.com/问题/ 7817951/string-concatenation-in-java-when-to-use-stringbuilder-and-concat) – givanse 2014-02-03 16:55:29

回答

9

编译器完全按照您的建议暗示。您可以打印生成的.class文件的字节码(使用javap -c)并查看要调用的调用并使用StringBuilder

但是,当字符串连接分散在多行代码中时,通常需要手动完成。编译器通常为涉及+的每个字符串值表达式分配一个单独的StringBuilder

+0

我一直在做这个错误。 >< – 2011-12-18 18:42:16

+1

@JeremyEdwards - 嘿。我已经说了很多事情。 :) – 2011-12-18 18:44:00

+2

**“当字符串连接分散在多行代码中时,通常需要手动完成”** - 我只是想强调@TedHopp所说的内容,所以它不会丢失。我在10行左右连接了250个字符的字符串,App Engine上的CPU时间为350毫秒。当我用一个StringBuilder替换它时,时间缩短到50毫秒,其他事情不变。 – 2014-12-27 20:03:14

1

泰德霍普的答案是好的,但它花了几次才明白。这是一个有希望更清楚的改写的答案。

字符串连接(即使用+,如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!"; 
+0

但是如果我的字符串只是''index =“+ i',那么最好的方法是什么?(对于性能) – GMX 2017-01-30 09:34:23

+0

@GMX,这是一个很好的问题,我认为这取决于上下文。如果这只是很少被调用,那么使用'“index =”+ i'比使用'StringBuilder'更可读。但是,如果在循环内部调用1000次并且性能是个问题,那么某种'StringBuilder'选项可能会更好。然而,接受的答案的主要观点是,当需要多行代码来构建字符串时,肯定会使用'StringBuilder'。 – Suragch 2017-01-30 09:48:03