2013-08-07 35 views
6

tôi cần phải sử dụng this method, và sau khi xem xét mã nguồn, tôi nhận thấy một khởi StringBuilder mà không phải là familar với tôi (tôi luôn luôn sử dụng các nhà xây dựng không tham số từ StringBuilder, ví dụ: new StringBuilder()).StringBuilder khởi trong Java

Trong phương pháp này:

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

Từ javadoc:

java.lang.StringBuilder.StringBuilder (int suất)

Constructs một người thợ xây chuỗi không có ký tự trong đó và dung lượng ban đầu là được chỉ định bởi đối số công suất.

Tại sao cần thay đổi chút ở đây?

Source code:

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

Trả lời

2

X < < 3 phương tiện nhân X bằng 8. Trong trường hợp của bạn nó có nghĩa là để phân bổ không gian cho 8 * ký tự list.size(). Nói chung, bạn không nên quan tâm đến chi tiết triển khai của lớp mà bạn đang sử dụng

+1

"bạn không nên quan tâm đến chi tiết triển khai của lớp mà bạn đang sử dụng" Thật không? đây co phải la một tro đua? – JohnJohnGa

+2

RẮN; đóng gói. Nếu bạn viết mã của bạn về kiến ​​thức cụ thể về các hoạt động bên trong của một lớp X, có khả năng cao mã của bạn không hoạt động đúng sau khi lớp X đã được sửa đổi. –

+0

xem chi tiết triển khai của thư viện nổi tiếng cũng có thể giúp bạn cải thiện kỹ năng mã hóa của mình – JohnJohnGa

3

Bitshift by 3 nghĩa là nhân với 2^3 là 8. Tác giả phải giả định rằng mỗi mục sẽ mất tối đa 8 ký tự trong chuỗi kết quả. Do đó, cô ta đã khởi tạo StringBuilder với dung lượng đó để nó hoạt động hiệu quả. Nếu giả định là chính xác StringBuilder sẽ không tái phân bổ cấu trúc bên trong.

0

Là phương thức nhân với 8 items.size().
Tôi nghĩ rằng lập trình viên chỉ cần suy đoán để initialCapacity để ngăn chặn (hoặc giảm đến mức tối thiểu) StringBuilder() tái phân bổ bộ đệm nội bộ.