隐式 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 版本,它只使用默认值。
手动检查字节码表明了同样的事情。
我几乎总是使用 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 版本,它只使用默认值。
手动检查字节码表明了同样的事情。