【问题标题】:Android StringBuilder vs String ConcatenationAndroid StringBuilder 与字符串连接
【发布时间】:2023-03-08 07:30:01
【问题描述】:

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

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

提示:当你打电话时不要忘记这一点

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

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

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

我的假设是否正确,还是手动使用 StringBuilder 代替字符串连接更好?

【问题讨论】:

标签: android string stringbuilder string-concatenation


【解决方案1】:

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!";

【讨论】:

  • 但是如果我的字符串只是 '"index=" + i',那么最好的方法是什么? (性能)
  • @GMX,这是一个很好的问题,我认为这取决于上下文。如果这只是很少被调用,那么使用"index=" + i 比使用StringBuilder 更具可读性。但是,如果它在循环内被调用 1000 次并且性能是一个问题,那么可能某种StringBuilder 选项会更好。不过,接受答案的要点是,当需要多行代码来构建字符串时,一定要使用StringBuilder
【解决方案2】:

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

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

【讨论】:

  • @JeremyEdwards - 呵呵。我已经说过很多事情了。 :)
  • “当字符串连接分布在多行代码中时,通常值得手动执行” - 我只是想强调@TedHopp 所说的内容,以免丢失.我在大约 10 行上连接了一个 250 个字符的字符串,App Engine 上的 CPU 时间为 350 毫秒。当我用单个 StringBuilder 替换它时,时间减少到 50 毫秒,其他事情没有改变。
猜你喜欢
  • 1970-01-01
  • 2010-12-04
  • 2011-07-22
  • 2010-09-09
  • 2011-12-26
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多