在Java中,是否在String.format()的实现中考虑了字符串的不变性?

foo*_*ter 6 java memory string string-formatting immutability

由于Java中的字符串是不可变的,我总是使用StringBuilder或StringBuffer来连接字符串.String.format()方法是否处理此问题以及StringBuilder或StringBuffer?换句话说,String.format()管理内存以及StringBuffer或StringBuilder吗?

San*_*rma 4

根据 Oracle JDK 的源代码,该实现似乎Formatter为每个String#format调用创建一个新的,进而StringBuilder为每个调用分配一个新的。所以是的。但正如对您的问题的评论所提到的,这在很大程度上是特定于实现的,尽管常识表明它将选择最有效的做事方式。

  • @fooMonster:这里最重要的概念不是关于“StringBuilder”的可变性或不变性,而是关于新创建的“StringBuilder”的“可见性”。`String.format` 创建一个新的 `Formatter()`,它仅对调用此方法的线程可见(因为它是一个“本地”/方法作用域变量),这又意味着由格式化程序创建的 `StringBuilder`也仅对调用线程可见。这就是 String.format() 是线程安全的原因。执行方法调用时不涉及任何实例级变量。:-) (2认同)