GitHub 1.3k ЗвездаПуть к тому, чтобы стать Java-инженером, почему бы тебе не прийти и не узнать?
существуетПочему Alibaba не рекомендует использовать «+» для конкатенации строк в циклах forВ этой статье мы представили несколько методов конкатенации строк в Java, а также их преимущества и недостатки. Существует также важный метод сплайсинга, который я не представил, а именно StringJoiner, представленный в Java 8. В этой статье будут представлены новички в этом сплайсинге строк.
Если вы хотите узнать, сколько способов объединения строк, я научу вас простому методу. В Intellij IDEA определите Java Bean, а затем попробуйте использовать сочетание клавиш для автоматического создания метода toString. IDEA предложит вам сгенерировать различные стратегии toString на выбор.
В настоящее время стратегия генерации toString в IDEA, которую я использую, по умолчанию использует StringJoiner, предоставляемый JDK 1.8.
вводить
StringJoiner — это класс в пакете java.util, который создает (необязательную) последовательность символов, разделенных разделителем, и может начинаться с предоставленного префикса и заканчиваться предоставленным суффиксом. Хотя также возможно добавлять разделители после каждой строки с помощью класса StringBuilder, StringJoiner предоставляет простой способ сделать это без написания большого количества кода.
Класс StringJoiner имеет 2 конструктора и 5 общедоступных методов. Наиболее часто используемые методы — это метод add и метод toString, которые аналогичны методу append и методу toString в StringBuilder.
использование
Использование StringJoiner относительно просто.В следующем коде мы используем StringJoiner для объединения строк.
public class StringJoinerTest {
public static void main(String[] args) {
StringJoiner sj = new StringJoiner("Hollis");
sj.add("hollischuang");
sj.add("Java干货");
System.out.println(sj.toString());
StringJoiner sj1 = new StringJoiner(":","[","]");
sj1.add("Hollis").add("hollischuang").add("Java干货");
System.out.println(sj1.toString());
}
}
Вывод приведенного выше кода:
hollischuangHollisJava干货
[Hollis:hollischuang:Java干货]
Стоит отметить, что когда мыStringJoiner(CharSequence delimiter)
инициализироватьStringJoiner
когда этоdelimiter
Фактически это разделитель, а не начальное значение переменной строки.
StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix)
Второй и третий аргументы — это префикс и суффикс объединенной строки соответственно.
принцип
После введения в простое использование, давайте взглянем на принцип этого StringJoiner и посмотрим, как он реализован. В основном посмотрите на метод добавления:
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
}
Увидел знакомую фигуру — StringBuilder, да, StringJoiner на самом деле реализован с опорой на StringBuilder.Почему Alibaba не рекомендует использовать «+» для конкатенации строк в циклах forВ этой статье мы представили принцип реализации StringBuilder, который не будет повторяться в этой статье.
Когда мы узнали, что StringJoiner на самом деле реализован в StringBuilder, мы, наверное, догадались,Его потеря производительности должна быть аналогична прямому использованию StringBuilder.!
Зачем вам StringJoiner
После понимания использования и принципа StringJoiner у многих читателей может возникнуть вопрос, очевидно, что StringBuilder уже существует, почему StringJoiner должен быть определен в Java 8? Какая польза?
Если читатель знает достаточно о Java 8, вы можете догадаться, что это должно быть связано со Stream.
Автор такжеJava docНашел ответ в:
A StringJoiner may be employed to create formatted output from a Stream using Collectors.joining(CharSequence)
Представьте, что в Java у нас есть такой список:
List<String> list = ImmutableList.of("Hollis","hollischuang","Java干货");
Если мы хотим объединить его в строку вида:
Hollis,hollischuang,Java干货
Это можно сделать:
StringBuilder builder = new StringBuilder();
if (!list.isEmpty()) {
builder.append(list.get(0));
for (int i = 1, n = list.size(); i < n; i++) {
builder.append(",").append(list.get(i));
}
}
builder.toString();
Также используйте:
list.stream().reduce(new StringBuilder(), (sb, s) -> sb.append(s).append(','), StringBuilder::append).toString();
Но выходной результат немного отличается и должен быть обработан дважды:
Hollis,hollischuang,Java干货,
Вы также можете использовать «+» для соединения:
list.stream().reduce((a,b)->a + "," + b).toString();
Для вышеперечисленных методов либо сложный код, либо невысокая производительность, либо невозможно получить желаемые результаты напрямую.
Для удовлетворения таких потребностей пригодится StringJoiner, представленный в Java 8. Вышеуказанные требования требуют только одной строки кода:
list.stream().collect(Collectors.joining(":"))
Вот и все. В использованном выше выражении исходный код Collectors.joining выглядит следующим образом:
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
return new CollectorImpl<>(
() -> new StringJoiner(delimiter, prefix, suffix),
StringJoiner::add, StringJoiner::merge,
StringJoiner::toString, CH_NOID);
}
Принцип его реализации заключается в использовании StringJoiner.
Конечно, может бытьCollector
использовать непосредственно вStringBuilder
Кажется, что аналогичную функцию можно реализовать, но она немного более громоздка. Итак, Java 8 предоставляетStringJoiner
обогащатьStream
использование.
иStringJoiner
Также удобно добавлять префиксы и суффиксы, например, строка, которую мы хотим получить, имеет вид[Hollis,hollischuang,Java干货]
вместоHollis,hollischuang,Java
Для галантереи преимущества StringJoiner еще более очевидны.
Суммировать
В этой статье представлен класс изменяемой строки, представленный в Java 8 — StringJoiner, который можно использовать для конкатенации строк.
StringJoiner на самом деле реализован StringBuilder, поэтому его производительность аналогична StringBuilder, и он также не является потокобезопасным.
Если при ежедневной разработке требуется сращивание строк, что выбрать?
1. Если это простая конкатенация строк, рассмотрите возможность прямого использования «+».
2. Если вы объединяете строки в цикле for, рассмотрите возможность использованияStringBuilder
иStringBuffer
.
3. Если черезList
Для конкатенации строк рассмотрите возможность использованияStringJoiner
.
GitHub 1.3k ЗвездаПуть к тому, чтобы стать Java-инженером, почему бы тебе не прийти и не узнать?
GitHub 1.3k ЗвездаПуть к тому, чтобы стать Java-инженером, ты правда не хочешь узнать?
GitHub 1.3k ЗвездаПуть к тому, чтобы стать Java-инженером, ты действительно уверен, что не хочешь узнать?