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 .