Ответ 1
Прежде всего. Это не то, как вы используете microbench Java
Прочитайте Как мне сначала написать правильный микро-тест в Java?. Ваши номера абсолютно неактуальны, поэтому игнорируем их.
Глядя на второй пример:
abc= "AZY"+"BAX"+"CBA"+...
Они выглядят как константы времени компиляции для меня. Этот String
был бы объединен во время компиляции, и было бы нечего сравнивать. Это бесполезное сравнение, поскольку вся точка StringBuilder
или String.join
заключается в объединении String
, которые не являются постоянной времени компиляции.
Перемещение на сравнение StringBuilder
и String.join
. Посмотрев исходный код:
public static String join(CharSequence delimiter, CharSequence... elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
// Number of elements not likely worth Arrays.stream overhead.
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}
В этом случае используется StringJoiner
. A StringJoiner
просто использует a StringBuilder
под капотом, поэтому они эквивалентны.
Часто гораздо более информативно смотреть на код, чем на то, чтобы попробовать и сравнить производительность. Даже если вы правильно проводите тесты.
Также стоит отметить, что ваш первый метод с join
объединяет 1000 String
в "" (пробел). В то время как ваш метод StringBuilder
просто присоединяет их вместе. Эти два не совпадают.
Точка метода String.join
заключается в том, что вы можете сделать:
String.join(", ", "a", "b", "c") // result is "a, b, c"
С помощью StringBuilder
вам нужно будет добавить намного больше кода.