如果性能很重要,我应该使用Java的String.format()吗?

我们必须一直构建String以便进行日志输出等等。在JDK版本中,我们了解了何时使用StringBuffer(很多追加,线程安全)和StringBuilder(很多追加,非线程安全)。


有什么使用建议String.format()?是高效的,还是在性能很重要的情况下,我们被迫坚持采用单线连接?


例如丑陋的旧风格,


String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";

与整洁的新样式(String.format,可能会更慢)相比,


String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);

注意:我的特定用例是整个代码中数百个“单行”日志字符串。它们不涉及循环,所以StringBuilder也太重了。我String.format()特别感兴趣。


饮歌长啸
浏览 4070回答 3
3回答

撒科打诨

我使用了hhafez代码并添加了一个内存测试:private static void test() {    Runtime runtime = Runtime.getRuntime();    long memory;    ...    memory = runtime.freeMemory();    // for loop code    memory = memory-runtime.freeMemory();我为每种方法,“ +”运算符String.format和StringBuilder(调用toString())分别运行此命令,因此所使用的内存不会受到其他方法的影响。我添加了更多串联,使字符串成为“ Blah” + i +“ Blah” + i +“ Blah” + i +“ Blah”。结果如下(每次平均运行5次):接近时间(毫秒)分配的内存(长)'+'运算符747 320,504 String.format 16484 373,312 StringBuilder 769 57,344我们可以看到String'+'和StringBuilder在时间上实际上是相同的,但是StringBuilder在内存使用方面效率更高。当我们在足够短的时间间隔内进行许多日志调用(或任何其他其他涉及字符串的语句)时,这非常重要,这样垃圾收集器将无法清理由'+'运算符引起的许多字符串实例。还有一个注意事项,顺便说一句,不要忘记在构造消息之前检查日志记录级别。结论:我将继续使用StringBuilder。我的时间太多或生活太少。

繁花如伊

JAVAC 1.6会自动将您以前的丑陋样式编译为:StringBuilder sb = new StringBuilder("What do you get if you multiply ");sb.append(varSix);sb.append(" by ");sb.append(varNine);sb.append("?");String s =  sb.toString();因此,这与使用StringBuilder绝对没有区别。String.format具有更大的重量,因为它创建了一个新的Formatter,解析了您的输入格式字符串,创建了一个StringBuilder,将所有内容附加到它并调用toString()。
打开App,查看更多内容
随时随地看视频慕课网APP