我几乎总是使用StringBuilder(int)来避免使用微小的默认容量进行愚蠢的重新分配。是否有任何javac实现在串联中使用适当的容量来隐式使用StringBuilder?考虑到字面长度,"abcdefghijklmnopqrstuvwxyz" + numbers + "!.?:"
至少会使用30的初始容量吗?
答案 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版本,它只使用默认值。
手动检查字节码表示同样的事情。