有没有办法在循环中重用Formatter或者我只是实例化并让垃圾收集器处理它? (这是一个Java问题)。请注意,如果我将实例化从循环中取出,则循环中先前迭代的格式化内容将被附加到。 Formatter.flush()似乎只是刷新,与其名称相同,并且没有提供允许重复使用干净的平板的好处。
示例:
for (...)
{
Formatter f = new Formatter();
f.format("%d %d\n", 1, 2);
myMethod(f.toString());
}
答案 0 :(得分:9)
您可以像这样使用它:
StringBuilder sb = new StringBuilder();
Formatter f = new Formatter(sb);
for (...)
{
f.format("%d %d\n", 1, 2);
myMethod(sb.toString());
sb.setLength(0);
}
这将重用Formatter和StringBuilder,这可能会或可能不会为您的用例带来性能提升。
答案 1 :(得分:1)
Formatter
的标准实现是“有状态的”,即使用它改变一些内部状态。这使得重用变得更加困难。
您可以尝试以下几个选项:
如果是您的代码,您可以添加reset()
方法来清除内部状态。缺点:如果你忘记调用这种方法,就会发生不好的事情。
相反,如果更改内部状态,您可以在format()
中返回格式化结果。由于您不再具有内部状态,因此可以在没有reset()
方法的情况下重复使用该对象,这样可以更安全地使用
但由于这是一个标准的API,你无法改变它。
只需在循环中创建新对象即可。用Java创建对象非常便宜,忘记它们并不需要花费任何成本。在垃圾收集中花费的时间是相对于活动对象的数量,而不是代码生成的死亡数量。基本上,GC完全无视任何未连接到任何其他对象的对象。因此,即使您在循环中调用new
十亿次,GC也不会注意到。
答案 2 :(得分:0)
只是实例化一个新的,并让旧的垃圾收集。
答案 3 :(得分:0)
for (...) { myMethod(String.format("%d %d\n", 1, 2)); }