3 回答
TA贡献1934条经验 获得超2个赞
我使用了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。
我的时间太多或生活太少。
TA贡献2012条经验 获得超12个赞
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()。
添加回答
举报