JavaRush /Java блог /Random UA /String += String чи StringBuilder.append(String)?
SemperAnte
4 рівень
Донецк

String += String чи StringBuilder.append(String)?

Стаття з групи Random UA
У цій статті, хотілося б розглянути, розібрати, розповісти і показати, у чому різниця між методом append з класу StringBuilderі оператором +=для String. Тут питання стоятиме не так в областях застосування, як в оптимізації коду.
String += String чи StringBuilder.append(String)?  - 1
Так, людина, яка безперечно не заглиблювалася в це питання, скаже: "Навіщо мені замінювати оператор + = створенням нового об'єкта взагалі іншого класу, після чого викликати ще й метод? Про яку оптимальність мова? Адже вибір очевидний, ти про що взагалі? toString()" і буде зовсім не правий. Одна із проблем полягає в тому, що Stringне є примітивом. String- об'єкт як і будь-який classJava, а як відомо, Java немає такого поняття як перевантаження операторів (Як наприклад в С++), оператори визначені тільки для примітивів, для будь-якого ж класу ми з вами не може перевизначити ніякий оператор. Саме тому оператори " +" та "+=" є свого роду "мабоцями" бібліотеки Java, а мабоця завжди зазнає втрат. Власне, давайте перестанемо тягнути хвіст за кота і перейдемо до вимірів. Ось проста програма заміряє час "склеювання" рядка зі змінною циклу 100000 разів.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Вітання";
        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");
    }
}
На моєму комп'ютері в консоль вивелося 6815ms. Тобто моєму комп'ютеру знадобилося майже 7 секунд, щоб склеїти цей рядок. Тепер давайте замінимо на StringBuilder і навіть включимо метод toString()у виміри.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Вітання");
        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");
    }
}
Мій ПК сказав мені 10ms. Т. е. 0.01 Секунди. Думаю, різниця на практиці дуже очевидна, грубо кажучи у 700 разів appendвідпрацював швидше. Викликано це тим, що найімовірніше " +" і "+=і самі можуть викликати цей же append, але при цьому пройшовши довгий шлях по мабоцях мови, щоб зрозуміти, що такий оператор взагалі є і що він повинен робити (останній абзац не більше ніж здогад, я не розробник JVM і не знаю що там і як) Це наочний приклад того, що зайвий об'єкт зовсім не завжди є витратним.Так, код стане на кілька рядків довшим, зате економія часу у великих проектах може стати колосальною.Прошу помітити, що виміри проводабося далеко не на офісному ПК з доісторичним процесором, а тепер уявіть, яка різниця буде на цьому самому офісному комп'ютері, який важко тягне косинку.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ