2013-08-07 11 views
6

avevo bisogno di usare this method, e dopo aver guardato il codice sorgente, ho notato un inizializzazione StringBuilder che non è familiare a me (io uso sempre il costruttore senza argomenti da StringBuilder, vale a dire new StringBuilder()).StringBuilder inizializzazione in Java

Nel metodo:

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

Dal JavaDoc:

java.lang.StringBuilder.StringBuilder (int capacity)

Costruisce un costruttore di stringa con nessun carattere in esso e una capacità iniziale specificata dall'argomento capacità.

Perché è necessario un po 'di spostamento qui?

Codice sorgente:

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

risposta

2

X < < 3 mezzi moltiplicano X per 8. Nella tua situazione vuol dire allocare spazio per 8 * list.size) caratteri (. In generale, non si dovrebbe preoccuparsi dei dettagli di implementazione di una classe che si sta utilizzando

+1

"non dovresti preoccuparti dei dettagli di implementazione di una classe che stai utilizzando" Davvero? è uno scherzo? – JohnJohnGa

+2

SOLID; incapsulamento. Se scrivi il tuo codice su una conoscenza specifica del funzionamento interno di una classe X, c'è un'alta probabilità che il tuo codice non funzioni correttamente dopo che la classe X è stata modificata. –

+0

esaminare i dettagli di implementazione di una libreria ben nota può anche aiutarti a migliorare le tue capacità di codifica – JohnJohnGa

3

Bitshift da 3 mezzi moltiplicando per 2^3 che è 8. L'autore deve aver assunto che ogni elemento avrà un massimo di 8 caratteri nella stringa risultante. Pertanto ha inizializzato lo StringBuilder con quella capacità in modo che funzioni in modo efficiente. Se l'ipotesi è corretta, StringBuilder non rialloca le strutture interne.

0

È una modalità da moltiplicare per 8 items.size().
Penso che il codificatore speculi solo su initialCapacity per impedire (o ridurre al minimo) la riallocazione del buffer interno StringBuilder().