私は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
指定するとパフォーマンスが目標になるため、文字列の作成中に必要なサイズ変更が少なくて済みます。私の質問は、これらのサイズ変更操作が実際にパフォーマンスをどれだけ低下させるかということです。この戦略は本当に速度の面で効率を向上させますか? (スペースに関しては、必要以上のスペースが割り当てられるとマイナスになることさえあるため) - なぜマジックナンバー
16
が使われているのですか?String
なぜ彼らは、配列内のそれぞれが 16 文字の長さであると想定するのでしょうか? この推測は何の役に立つでしょうか?