隐式StringBuilder大小

时间:2017-04-04 18:40:01

标签: java concatenation stringbuilder

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

2 个答案:

答案 0 :(得分:4)

是的,它实际上是聪明的 - 实际上 - 在Java 9中。(这是我可以松散地声称我参与其中的一部分 - 我made最初建议使用StringBuilders ,这激发了他们最终采用的更好,更强大的方法。)

除了其他问题之外,

http://openjdk.java.net/jeps/280特别提到了#34;有时我们需要适当地预先确定StringBuilder,"这是一项具体的改进。

(故事的寓意是,尽可能简单易读地编写代码,让编译器和JIT处理适当的优化工作。)

答案 1 :(得分:0)

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

为了测试这个,我创建了一个简单的方法:

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版本,它只使用默认值。

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