隐式 StringBuilder 大小

Implicit StringBuilder size

我几乎总是使用 StringBuilder(int) 来避免使用微小的默认容量进行愚蠢的重新分配。是否有任何 javac 实现做任何特殊的事情来使用适当的容量来隐式使用 StringBuilder 串联?给定字面长度,"abcdefghijklmnopqrstuvwxyz" + numbers + "!.?:" 会至少使用 30 的初始容量吗?

是的,在 Java 9 中它会变得那么聪明——实际上更聪明。(这是我可以松散地声称我是其中的一部分的东西——我 made预调整 StringBuilder 大小的最初建议,这启发了他们最终采用了更好、更强大的方法。)

http://openjdk.java.net/jeps/280 特别提到 "sometimes we need to presize the StringBuilder appropriately,",这是一项具体的改进。

(这个故事的寓意是,尽可能简单易读地编写代码,让编译器和 JIT 负责优化,这正是它们的工作。)

这可能取决于您的编译器版本、设置等。

为了对此进行测试,我创建了一个简单的方法:

public static void main(String[] args) {
    System.out.println("abcdefghijklmnopqrstuvwxyz" + args[0] + "!.?:");
}

编译后运行通过反编译器得到如下结果:

System.out.println((new StringBuilder()).append("abcdefghijklmnopqrstuvwxyz").append(args[0]).append("!.?:").toString());

所以看起来,至少对于某些 javac 版本,它只使用默认值。

手动检查字节码表明了同样的事情。