Перейти к основному содержимому

Объединение строк в Java

· 5 мин. чтения

1. Введение

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

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

2. Построитель строк

Прежде всего, это скромный StringBuilder. Этот класс предоставляет набор утилит для построения строк , упрощающих работу со строками .

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

StringBuilder stringBuilder = new StringBuilder(100);

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

assertEquals("ForEach 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 , который прекрасно форматирует массив объектов. Массивы . Метод toString также вызывает метод toString любого вложенного объекта, поэтому нам нужно убедиться, что он определен.

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

String toString = Arrays.toString(myFavouriteLanguages);

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

К сожалению, массивы. Метод 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 .