Android StringBuilder与字符串连接
我正在阅读此文档页 这里的部分引起了我的注意: 小贴士:当你打这样的电话时,别忘了这一点Android StringBuilder与字符串连接,android,string,stringbuilder,string-concatenation,Android,String,Stringbuilder,String Concatenation,我正在阅读此文档页 这里的部分引起了我的注意: 小贴士:当你打这样的电话时,别忘了这一点 Log.v(标签,“index=“+i”) 当您构建要传递到Log.d的字符串时,编译器 使用StringBuilder,并且至少发生三次分配: StringBuilder本身、缓冲区和字符串对象。 实际上,还有另一个缓冲区分配和复制,以及 对gc的压力更大。这意味着如果您的日志消息 过滤掉后,您可能正在做重要的工作,并导致 巨大的开销 这意味着Android编译器采用字符串连接(+),并将其转换为Stri
Log.v(标签,“index=“+i”)代码>
当您构建要传递到Log.d的字符串时,编译器
使用StringBuilder,并且至少发生三次分配:
StringBuilder本身、缓冲区和字符串对象。
实际上,还有另一个缓冲区分配和复制,以及
对gc的压力更大。这意味着如果您的日志消息
过滤掉后,您可能正在做重要的工作,并导致
巨大的开销
这意味着Android编译器采用字符串连接(+),并将其转换为StringBuilder和append语句
我的假设正确吗?还是手动使用StringBuilder而不是字符串连接更好?编译器完全按照您的建议执行。您可以打印生成的.class文件的字节码(使用javap-c
),并查看构造和使用StringBuilder
的调用
但是,当字符串串联分散在几行代码上时,通常值得手动执行。编译器通常为涉及+
的每个字符串值表达式分配一个单独的StringBuilder
,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!";
@杰里米-哈。我说过很多事情。:)“当字符串串接分散在几行代码中时,通常值得手动执行”-我只想强调@TedHopp所说的,这样它就不会丢失。我在大约10行上连接了一个250个字符的字符串,AppEngine上的cpu时间是350毫秒。当我用一个StringBuilder替换它时,时间降到了50毫秒,其他事情没有改变。可能是重复的,但是如果我的字符串只是“index=“+I”,那么最好的方法是什么?(对于性能)@GMX,这是一个好问题,我认为这取决于上下文。如果这只是不经常调用,那么使用“index=“+i
比使用StringBuilder
可读性强得多。但是,如果它在循环中被调用1000次,并且性能是一个问题,那么某种StringBuilder
选项可能会更好。不过,公认答案的要点是,当需要多行代码来构建字符串时,一定要使用StringBuilder
。