2011-07-13 26 views
6

由于Java中的字符串是不可变的,我一直使用StringBuilder或StringBuffer来连接字符串。 String.format()方法是否像StringBuilder或StringBuffer一样处理这个问题?换句话说,String.format()是否像StringBuffer或StringBuilder一样管理内存?在Java中,是否在String.format()的实现中考虑了Strings的不变性?

+9

(1)这是特定于实现的。 (2)直到你有数据显示它不能很好地工作,无论它如何被实施,它都可以工作。 (3)正如在第2条中所暗示的那样,并且作为*总是*带有这样的问题,唯一确定的方法是描述。 – delnan

回答

4

基于Oracle JDK的源代码,似乎该实现为每个String#format调用创建一个新的Formatter,然后为每个调用分配一个新的StringBuilder。所以是的。但正如你对问题的评论所提到的那样,虽然常识意味着它会选择最有效的做事方式,但这是非常多的实现细节。

+0

有趣,谢谢!因此,作为后续工作,由于StringBuilder不是线程安全的,因此我认为String.format()也不是线程安全的......至少是Oracle实现? – fooMonster

+1

如果每次格式调用都会创建一个新的StringBuilder并将其保留在方法的本地,那么对格式的调用仍然可以是线程安全的。 –

+0

@Michael“仍然可以线程安全”?这听起来像是暗示开发人员可以通过以线程安全的方式调用String.format()来使其线程安全。显然。也许我不清楚。跟进,以及原来的问题是关于String.format()的实现。所以我的后续会更好摆在“由于String.format()的实现依赖于Oracle实现中的StringBuilder,并且由于我们知道StringBuilder不是线程安全的,这是否意味着实现String.format()在oracle的jdk中也不是线程安全的?“ – fooMonster

相关问题