Quando dovrei usare StringBuilder o StringBuffer?

13

In un'applicazione web di produzione, i miei colleghi programmatori hanno utilizzato StringBuffer ovunque. Ora mi sto occupando dello sviluppo e delle correzioni dell'applicazione. Dopo aver letto StringBuilder e StringBuffer Ho deciso di sostituire tutto il codice StringBuffer con StringBuilder perché non abbiamo bisogno della sicurezza del thread nei nostri bean di dati .

Ad esempio: (In ogni bean di dati posso vedere l'uso di StringBuffer)

@Override
public String toString() {
    StringBuffer sb = new StringBuffer();// replace it from StringBuilder
    sb.append(" ABCD : ").append(abcd);
    sb.append(", EFGH : ").append(efgh);
    sb.append(", IJKL : ").append(ijkl);
}

Creiamo un data bean separato per ogni sessione / richiesta. Una sessione viene utilizzata da un singolo utente che nessun altro utente può accedervi.

Devo prendere in considerazione altri punti prima di migrare?

Se c'è un singolo thread (nessun thread in attesa / nessun nuovo thread cercherà il blocco degli oggetti), si comporta allo stesso modo sia con StringBuffer che con StringBuilder. So che nel caso di StringBuffer, ci vuole tempo per prendere il blocco dell'oggetto, ma voglio sapere se c'è qualche differenza di prestazioni tra di loro eccetto il blocco / rilascio del blocco dell'oggetto.

    
posta Satish Pandey 26.08.2012 - 09:09
fonte

2 risposte

22

L'unica differenza tra i due è la sincronizzazione utilizzata in StringBuffer. Il sovraccarico della sincronizzazione non è enorme nel grande schema delle cose, ma è significativo rispetto ai metodi StringBuilder che non li hanno. La JVM sta facendo un lavoro che altrimenti non avrebbe dovuto fare, specialmente con un solo thread, ecc.

Se il tuo codice funziona e le persone non si lamentano delle prestazioni, non me ne preoccuperei. Non hai intenzione di ottenere un sacco di soldi per il tuo dollaro. Tuttavia, se stai scrivendo un nuovo codice o stai aggiornando il codice che utilizza StringBuffer, ti suggerisco di convertirli StringBuilder allo stesso tempo.

    
risposta data 26.08.2012 - 09:29
fonte
8

StringBuilder è stato aggiunto a un punto (Java 1.5) per essere uno StringBuffer migliore e più veloce e il compilatore lo utilizza sotto il cofano per implementare l'operatore + su Stringhe.

Ciò significa che, utilizzando StringBuilder, non è possibile eseguire il codice su JVM più vecchio rispetto a quando è stata introdotta la classe. Questo sarebbe un problema per noi, ancora per un po '. Se esegui sempre l'ultima, non devi preoccupartene.

Non seguirei il processo di ottimizzazione che hai svolto, anche se per i seguenti motivi.

  • Passaggi stretti esterni il vantaggio è trascurabile. A meno che non si presenti esplicitamente come hotspot in un profiler, non mi preoccuperei.
  • La modifica del codice potrebbe introdurre errori e devi ripetere accuratamente l'applicazione. Potrebbe essere molto più costoso di vivere con una classe sincronizzata in un'impostazione non sincronizzata.
risposta data 26.08.2012 - 09:48
fonte

Leggi altre domande sui tag