«1. Введение

Java предоставляет значительное количество методов и классов, предназначенных для объединения строк.

В этом уроке мы рассмотрим некоторые из них, а также обрисуем некоторые распространенные ловушки и плохие практики.

2. StringBuilder

Сначала идет скромный StringBuilder. Этот класс предоставляет набор утилит для построения строк, которые упрощают работу со строками.

Давайте построим быстрый пример конкатенации строк, используя класс StringBuilder:

StringBuilder stringBuilder = new StringBuilder(100);

stringBuilder.append("Baeldung");
stringBuilder.append(" is");
stringBuilder.append(" awesome");

assertEquals("Baeldung is awesome", stringBuilder.toString());

Внутри StringBuilder поддерживает изменяемый массив символов. В нашем примере кода мы объявили начальный размер 100 с помощью конструктора StringBuilder. Из-за этого объявления размера StringBuilder может быть очень эффективным способом объединения строк.

Также стоит отметить, что класс StringBuffer является синхронизированной версией StringBuilder.

Хотя синхронизация часто является синонимом безопасности потоков, ее не рекомендуется использовать в многопоточных приложениях из-за шаблона построителя StringBuffer. В то время как отдельные вызовы синхронизированного метода являются потокобезопасными, многократные вызовы — нет.

3. Оператор сложения

Далее следует оператор сложения (+). Это тот же самый оператор, который приводит к сложению чисел и перегружается для конкатенации при применении к строкам.

Давайте кратко рассмотрим, как это работает:

String myString = "The " + "quick " + "brown " + "fox...";

assertEquals("The quick brown fox...", myString);

На первый взгляд, это может показаться намного более кратким, чем опция StringBuilder. Однако при компиляции исходного кода символ + транслируется в цепочки вызовов StringBuilder.append(). Из-за этого смешивание метода конкатенации StringBuilder и + считается плохой практикой.

Кроме того, следует избегать конкатенации строк с помощью оператора + внутри цикла. Поскольку объект String неизменяем, каждый вызов конкатенации приведет к созданию нового объекта String.

4. Строковые методы

Сам класс String предоставляет целый набор методов для объединения строк.

4.1. String.concat

Неудивительно, что метод String.concat является нашим первым портом вызова при попытке объединить объекты String. Этот метод возвращает объект String, поэтому объединение методов в цепочку является полезной функцией.

String myString = "Both".concat(" fickle")
  .concat(" dwarves")
  .concat(" jinx")
  .concat(" my")
  .concat(" pig")
  .concat(" quiz");

assertEquals("Both fickle dwarves jinx my pig quiz", myString);

В этом примере наша цепочка начинается с литерала String, затем метод concat позволяет нам объединять вызовы в цепочку для добавления дополнительных строк.

4.2. String.format

Далее следует метод String.format, который позволяет нам внедрять различные объекты Java в шаблон String.

Сигнатура метода String.format принимает одну строку, обозначающую наш шаблон. Этот шаблон содержит символы «%», обозначающие, где в нем должны быть размещены различные объекты.

Как только наш шаблон объявлен, он принимает массив объектов varargs, который вставляется в шаблон.

Давайте посмотрим, как это работает, на быстром примере:

String myString = String.format("%s %s %.2f %s %s, %s...", "I",
  "ate",
  2.5056302,
  "blueberry",
  "pies",
  "oops");

assertEquals("I ate 2.51 blueberry pies, oops...", myString);

Как мы видим выше, метод внедрил наши строки в правильный формат.

4.3. String.join (Java 8+)

Если наше приложение работает на Java 8 или выше, мы можем воспользоваться преимуществами метода String.join. При этом мы можем соединить массив строк с общим разделителем, гарантируя, что не будут пропущены пробелы.

String[] strings = {"I'm", "running", "out", "of", "pangrams!"};

String myString = String.join(" ", strings);

assertEquals("I'm running out of pangrams!", myString);

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

5. StringJoiner (Java 8+)

StringJoiner абстрагирует всю функциональность String.join в простой в использовании класс. Конструктор принимает разделитель с необязательными префиксом и суффиксом. Мы можем добавлять строки, используя хорошо названный метод add.

StringJoiner fruitJoiner = new StringJoiner(", ");

fruitJoiner.add("Apples");
fruitJoiner.add("Oranges");
fruitJoiner.add("Bananas");

assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString());

Используя этот класс вместо метода String.join, мы можем добавлять строки во время работы программы; Нет необходимости сначала создавать массив!

Перейдите к нашей статье о StringJoiner для получения дополнительной информации и примеров.

6. Массивы.toString

«Что касается массивов, класс Array также содержит удобный метод toString, который прекрасно форматирует массив объектов. Метод Arrays.toString также вызывает метод toString любого вложенного объекта, поэтому нам нужно убедиться, что он определен.

String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"};

String toString = Arrays.toString(myFavouriteLanguages);

assertEquals("[Java, JavaScript, Python]", toString);

К сожалению, метод Arrays.toString не настраивается и выводит только строку, заключенную в квадратные скобки.

7. Collectors.joining (Java 8+)

Наконец, давайте рассмотрим метод Collectors.joining, который позволяет нам направлять вывод Stream в одну строку.

List<String> awesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo");

String animalString = awesomeAnimals.stream().collect(Collectors.joining(", "));

assertEquals("Shark, Panda, Armadillo", animalString);

Использование потоков открывает все функциональные возможности, связанные с Java 8 Stream API, такие как фильтрация, сопоставление, итерация и многое другое.

8. Подведение итогов

В этой статье мы подробно рассмотрели множество классов и методов, используемых для объединения строк в языке Java.

Как всегда, исходный код доступен на GitHub.