Android StringBuilder vs String Concatenation

时间:2011-12-18 18:32:19

标签: android string stringbuilder string-concatenation

我正在阅读此文档页面http://developer.android.com/reference/android/util/Log.html

这里的部分引起了我的注意:

  

提示:当您拨打电话时不要忘记

     

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

     

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

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

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

2 个答案:

答案 0 :(得分:9)

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

但是,当字符串连接分布在几行代码上时,通常值得手动执行。编译器通常为每个涉及StringBuilder的字符串值表达式分配+

答案 1 :(得分:2)

Ted Hopp的答案很好,但需要阅读几次才能理解。这是一个重新回答的答案,希望更清楚。

字符串连接(即,{ "plugins": ["transform-decorators-legacy"] } 中使用+)在后台使用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!");