Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android StringBuilder与字符串连接_Android_String_Stringbuilder_String Concatenation - Fatal编程技术网

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