Требует ли конкатенация в операторе append () StringBuilder времени выполнения, отличного от использования двух операторов append ()? - PullRequest
0 голосов
/ 01 января 2019

Мне было интересно, меняется ли скорость выполнения, если программист объединяется внутри оператора append () Stringbuilder или просто использует два оператора добавления вместо одного.

Я задаю этот вопрос, чтобы помочь мне понять, почему мы вообще используем класс StringBuilder, когда мы можем просто объединить.

Пример объединения:

public class MCVE {

    public static void main(String[] args) {
        String[] myArray = {"Some", "stuff", "to", "append", "using", "the",
                "StringBuilder", "class's", "append()", "method"};

        StringBuilder stringBuild = new StringBuilder();

        for(String s: myArray) {
            stringBuild.append(s + " ");
        }

    }
}

Double-Append () Пример:

public class MCVE {

    public static void main(String[] args) {
        String[] myArray = {"Some", "stuff", "to", "append", "using", "the",
                "StringBuilder", "class's", "append()", "method"};

        StringBuilder stringBuild = new StringBuilder();

        for(String s: myArray) {
            stringBuild.append(s);
            stringBuild.append(" ");
        }

    }
}

1 Ответ

0 голосов
/ 01 января 2019

Теоретически, да, версия конкатенации займет больше времени, потому что под прикрытием она создает совершенно новый StringBuilder, добавляет s, добавляет " ", а затем использует toString для создания (!) Aстрока для передачи на append, который вы закодировали.(Это то, что делает компилятор. Чтобы узнать о вашей конкретной ситуации, вам нужно протестировать эталонный представитель вашего фактического кода. В конце концов, JIT будет участвовать, если онгорячая точка во время выполнения.)

Конечно, вы, вероятно, не заметите.Но тем не менее, если вы уже используете StringBuilder, используйте его (выполнив append дважды).: -)


(Первый абзац выше не будет истинным, если они оба будут строковыми литералами, например "foo" + "bar". Компилятор выполняет эту конкатенацию.)

...