JavaRush /Java Blog /Random-IT /String += String o StringBuilder.append(String)?
SemperAnte
Livello 4
Донецк

String += String o StringBuilder.append(String)?

Pubblicato nel gruppo Random-IT
In questo articolo, vorrei considerare, analizzare, raccontare e mostrare qual è la differenza tra il metodo append della classe StringBuildere l'operatore +=per String. Qui la questione non riguarderà tanto le aree di applicazione quanto l'ottimizzazione del codice.
String += String o StringBuilder.append(String)?  -1
Sì, una persona che senza dubbio non ha approfondito la questione dirà: "Perché dovrei sostituire l'operatore += creando un nuovo oggetto di una classe completamente diversa, e poi chiamare anche il metodo toString()? Che tipo di ottimalità siamo?" di cosa stai parlando? La scelta è ovvia, di cosa stai parlando?” e avrebbe completamente torto. Uno dei problemi è che Stringnon è primitivo. String- un oggetto come qualsiasi altro classin Java e, come sai, in Java non esiste l'overload degli operatori (come in C++, ad esempio), gli operatori sono definiti solo per le primitive e per qualsiasi classe non possiamo sovrascrivere alcun operatore. Questo è il motivo per cui gli operatori " +" e " += " sono una sorta di "stampella" della libreria Java e una stampella comporta sempre delle perdite. In realtà, smettiamola di tirare la coda al gatto e passiamo alle misurazioni. Ecco un semplice programma che misura il tempo necessario per “incollare” una linea con una variabile loop 100.000 volte.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Hello";
        for(int i = 0; i < 100000; ++i)
        {
            s+=i;
        }
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Sul mio computer, nella console veniva visualizzato 6815 ms. Cioè, il mio computer ha impiegato quasi 7 secondi per unire insieme questa linea. Ora sostituiamolo con StringBuilder e includiamo anche il metodo toString()nelle misurazioni.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Hello");
        for(int i = 0; i < 100000; ++i)
        {
            sb.append(i);
        }
        String s = sb.toString();
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Il mio PC mi ha detto 10ms. Cioè, 0,01 secondi. Penso che la differenza nella pratica sia abbastanza evidente; grosso modo, ha funzionato 700 volte appendpiù velocemente. Ciò è dovuto al fatto che molto probabilmente " " +e " +=" possono essi stessi chiamare la stessa aggiunta, ma allo stesso tempo hanno fatto molta strada attraverso le stampelle del linguaggio per capire che un tale operatore esiste e cosa significa dovrebbe fare (l'ultimo paragrafo non è altro che un'ipotesi, non sono uno sviluppatore JVM e non so cosa ci sia e come). Questo è un chiaro esempio del fatto che un oggetto in più non sempre è costoso. Sì, il codice diventerà più lungo di un paio di righe, ma il risparmio di tempo nei progetti di grandi dimensioni può essere colossale. Tieni presente che le misurazioni non sono state effettuate su un PC da ufficio con un processore preistorico, ma ora immagina che differenza farà proprio su questo computer da ufficio, che difficilmente riesce a tirare la sciarpa.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION