3

有没有办法在循环中重用格式化程序,或者我只是实例化并让垃圾收集器处理它?(这是一个 Java 问题)。请注意,如果我从循环中取出实例化,则循环中先前迭代的格式化内容将被附加到。Formatter.flush() 似乎只是刷新,名副其实,并没有提供允许重新使用干净的石板的好处。

例子:

for (...)
{
    Formatter f = new Formatter();
    f.format("%d %d\n", 1, 2);
    myMethod(f.toString());
}
4

4 回答 4

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,这可能会或可能不会为您的用例带来性能提升。

于 2011-05-24T08:22:49.363 回答
1

的标准实现Formatter是“有状态的”,即使用它会改变一些内部状态。这使得重用变得更加困难。

您可以尝试多种选择:

  1. 如果是您的代码,您可以添加一个reset()方法来清除内部状态。缺点:如果忘记调用这个方法,就会发生不好的事情。

  2. 相反,如果更改内部状态,您可以在format(). 由于您不再拥有内部状态,因此可以在没有reset()方法的情况下重用对象,这使得使用起来更加安全

但由于这是一个标准 API,您无法更改它。

只需在循环中创建新对象。在 Java 中创建对象非常便宜,并且忘记它们不会花费任何成本。垃圾收集所花费的时间与活对象的数量有关,而不是与代码产生的死对象的数量有关。基本上,GC 完全忽略了任何不再连接到任何其他对象的对象。因此,即使您new在循环中调用了十亿次,GC 也不会注意到。

于 2011-05-24T08:27:16.953 回答
0

只需实例化一个新的并让旧的垃圾收集。

于 2011-05-24T08:21:12.630 回答
0
为了 (...) {
    myMethod(String.format("%d %d\n", 1, 2));
}
于 2011-05-24T08:26:18.090 回答