9

我需要使用这种方法,在查看源代码后,我注意到一个我StringBuilder不熟悉的初始化(我总是使用StringBuilder, ie的无参数构造函数new StringBuilder())。

在方法中:

StringBuilder sb = new StringBuilder(items.size() << 3);

来自 JavaDoc:

java.lang.StringBuilder.StringBuilder(整数容量)

构造一个字符串构建器,其中没有字符,初始容量由容量参数指定。

为什么这里需要移位?

源代码:

/** 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();
  }
4

3 回答 3

5

Bitshift by 3 表示乘以 2^3,即 8。作者必须假设每个项目在结果字符串中最多占用 8 个字符。因此,她或他使用该容量初始化了StringBuilder它,以便它有效地运行。如果假设正确StringBuilder,则不会重新分配内部结构。

于 2013-08-07T10:13:34.843 回答
3

X << 3 表示将 X 乘以 8。在您的情况下,这意味着为 8*list.size() 个字符分配空间。一般来说,您不应该关心您正在使用的类的实现细节

于 2013-08-07T10:11:32.867 回答
0

是乘以 8 的一种方式items.size()
我认为编码器只是推测 initialCapacity 以防止(或减少到最低限度)StringBuilder()内部缓冲区重新分配。

于 2013-08-07T10:43:21.343 回答