gpt4 book ai didi

java - 了解 StringUtils.join 性能决策

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:53:49 24 4
gpt4 key购买 nike

我正在查看 Apache Commons 的 StringUtils.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 提供初始容量目标性能,因此在构建字符串时需要较少的调整大小。我的问题是:这些调整大小操作实际上对性能有多大影响?这种策略真的在速度方面提高了效率吗? (因为就空间而言,如果分配的空间超过必要的空间,它甚至可能是负数)
  • 为什么使用魔数(Magic Number) 16?为什么他们会假设数组中的每个 String 都是 16 个字符长?这个猜测有什么用?

最佳答案

16 是对带分隔符的字符串的预期平均大小的轻微高估(大概基于经验/统计数据)。

预先分配足够的空间来保存整个结果,避免在执行期间用更大(双倍大小)的数组替换支持数组和复制元素(这是一个 O(n) 操作)。

如果在大多数情况下避免替换操作,分配更大的数组是值得的,即使是相当多的估计也是值得的。

关于java - 了解 StringUtils.join 性能决策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37253848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com