2013-08-07 72 views
6

我需要使用this method,并在查看源代码后,我注意到StringBuilder初始化,这与我不相似(我始终使用StringBuilder的无参数构造函数,即new StringBuilder())。在Java中StringBuilder初始化

在该方法中:

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

从JavaDoc的:

java.lang.StringBuilder.StringBuilder(INT容量)

构造一个字符串生成其中不带字符和容量参数指定的初始容量为 。

为什么这里需要一点转变?

源代码:

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

回答

2

X < < 3装置通过乘以8中的X您的情况就意味着要为8 *则为list.size()字符分配空间。一般而言,您不应该关心您正在使用的课程的实施细节

+1

“你不应该在乎一个类的实现细节,您使用的是”真的吗?你在开玩笑吗? – JohnJohnGa

+2

SOLID;封装。如果您根据有关X类内部工作的特定知识编写代码,那么在X类被修改后,您的代码很可能无法正常工作。 –

+0

看着众所周知图书馆的实施细节也可以帮助你提高你的编程技巧 – JohnJohnGa

3

3代表的移位意味着乘以8的2^3。作者必须假定每个项目最多需要8个字符结果字符串。因此,她或他使用该容量初始化StringBuilder,以便高效运行。如果假设是正确的,StringBuilder将不会重新分配内部结构。

0

由8个items.size()乘以一个模式。
我觉得只是编码器来推测到参数:initialCapacity防止(或减少到最低限度)StringBuilder()内部缓冲区重新分配。