Java中的StringBuilder初始化

9
我需要使用这个方法,在查看源代码后,我注意到了一个对我不熟悉的StringBuilder初始化(我通常使用无参构造函数从StringBuilder创建新实例,即new StringBuilder())。
在该方法中:
StringBuilder sb = new StringBuilder(items.size() << 3);

从JavaDoc中可以看到:

java.lang.StringBuilder.StringBuilder(int capacity)

构造一个没有任何字符的字符串生成器,并使用capacity参数指定的初始容量。

为什么需要在这里进行位移操作?

源代码:

/** Creates a backslash escaped string, joining all the items. */
  public static String join(List<?> items, char separator) {
    StringBuilder sb = new StringBuilder(items.size() << 3);
    boolean first=true;
    for (Object o : items) {
      String item = o.toString();
      if (first) {
        first = false;
      } else {
        sb.append(separator);
      }
      for (int i=0; i<item.length(); i++) {
        char ch = item.charAt(i);
        if (ch=='\\' || ch == separator) {
          sb.append('\\');
        }
        sb.append(ch);
      }
    }
    return sb.toString();
  }
3个回答

5

按3位二进制位移相当于乘以2^3,即8。作者肯定假设每个项在生成的字符串中最多占用8个字符。因此,他/她初始化了 StringBuilder 的容量,以使其运行高效。如果假设是正确的, StringBuilder 将不会重新分配内部结构。


3

X << 3 意味着将 X 乘以 8。在你的情况下,它意味着为 8*list.size() 个字符分配空间。通常情况下,你不应该关心你正在使用的类的实现细节。


1
你不应该关心你正在使用的类的实现细节。真的吗?这是个笑话吗? - JohnJohnGa
2
SOLID;封装。如果您编写的代码基于对类X内部工作原理的特定知识,那么在修改X类后,您的代码很可能无法正常工作。 - Svetlin Zarev
查看知名库的实现细节也可以帮助您提高编码技能。 - JohnJohnGa
1
好的,但这并不意味着实现细节不会改变。例如,看一下JRE 7中的String类 http://www.transylvania-jug.org/archives/5530 - Svetlin Zarev
编写代码使其能够在任何实现环境下正常工作(这是一件好事),并不意味着不关心实现环境。你应该关心,并避免使用与当前/常见实现环境交互不良的代码。 - harold

0

是一种乘以8的模式 items.size()
我认为程序员只是猜测initialCapacity,以防止(或将其最小化)StringBuilder()内部缓冲区重新分配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接