我正在查看 Apache CommonsStringUtils.join
方法的实现,偶然发现了一条我认为是为了提高性能而考虑的线,但我不明白为什么他们以这些特定的值这样做。
这是实现:
public static String join(Object[] array, String separator, int startIndex, int endIndex) {
if (array == null) {
return null;
}
if (separator == null) {
separator = EMPTY;
}
// endIndex - startIndex > 0: Len = NofStrings *(len(firstString) + len(separator))
// (Assuming that all Strings are roughly equally long)
int noOfItems = (endIndex - startIndex);
if (noOfItems <= 0) {
return EMPTY;
}
StringBuilder buf = new StringBuilder(noOfItems * 16); // THE QUESTION'S ABOUT THIS LINE
for (int i = startIndex; i < endIndex; i++) {
if (i > startIndex) {
buf.append(separator);
}
if (array[i] != null) {
buf.append(array[i]);
}
}
return buf.toString();
}
我的问题是关于这StringBuilder buf = new StringBuilder(noOfItems * 16);
条线的:
- 我假设给
StringBuilder
初始容量目标性能,因此在构建字符串时需要更少的调整大小。我的问题是:这些调整大小操作实际上对性能有多大影响?这种策略真的能在速度方面提高效率吗?(因为就空间而言,如果分配的空间超过了必要,它甚至可能是负数) - 为什么要
16
使用幻数?为什么他们会假设String
数组中的每个都是 16 个字符长?这个猜测有什么用?