我正在阅读此文档页面http://developer.android.com/reference/android/util/Log.html。
这里的部分引起了我的注意:
提示:当您拨打电话时不要忘记
Log.v(TAG, "index=" + i);
当你构建字符串以传递给Log.d时,编译器 使用StringBuilder并且至少发生三次分配: StringBuilder本身,缓冲区和String对象。 实际上,还有另一个缓冲区分配和复制,以及 对gc的压力更大。这意味着如果您的日志消息是 过滤掉了,你可能正在做重要的工作和招致 显着的开销。
这意味着Android编译器正在使用字符串连接(+)并将它们转换为StringBuilder并附加语句。
我的假设是正确的还是手动使用StringBuilder而不是字符串连接更好?
答案 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!");