Автор оригинала: Sam Millington.
1. введение
Java предоставляет значительное количество методов и классов, предназначенных для объединения строк.
В этом уроке мы погрузимся в некоторые из них, а также опишем некоторые общие подводные камни и плохие практики.
2. StringBuilder
Во-первых, это скромный StringBuilder. Этот класс предоставляет массив утилит String- building , которые облегчают работу с String манипуляциями.
Давайте построим быстрый пример String конкатенации с использованием класса 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 builder. В то время как отдельные вызовы синхронизированного метода являются потокобезопасными, несколько вызовов не являются .
3. Оператор Сложения
Далее следует оператор сложения (+). Это тот же оператор, который приводит к сложению чисел и перегружен для объединения при применении к строкам .
Давайте быстро посмотрим, как это работает:
String myString = "The " + "quick " + "brown " + "fox..."; assertEquals("The quick brown fox...", myString);
На первый взгляд это может показаться гораздо более кратким, чем параметр StringBuilder . Однако при компиляции исходного кода символ + преобразуется в цепочки вызовов StringBuilder.append () . Из-за этого смешивание StringBuilder и + метода конкатенации считается плохой практикой .
Кроме того, следует избегать конкатенации String с использованием оператора + в цикле. Поскольку объект String является неизменяемым, каждый вызов конкатенации приведет к созданию нового объекта String .
4. Строковые методы
Сам класс String предоставляет целый ряд методов для объединения строк .
4.1. Строка.Конкат
Неудивительно, что метод 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 , который позволяет нам вводить различные объекты 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. Строка.присоединиться (Java 8+)
Если наше приложение работает на Java 8 или выше , мы можем воспользоваться строкой .метод 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 абстрагирует всю строку .объедините функциональность в простой в использовании класс. Конструктор принимает разделитель с необязательным префиксом и суффиксом . Мы можем добавить Строки , используя хорошо названный метод add .
StringJoiner fruitJoiner = new StringJoiner(", "); fruitJoiner.add("Apples"); fruitJoiner.add("Oranges"); fruitJoiner.add("Bananas"); assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString());
Используя этот класс вместо строки .присоединяйтесь к методу, мы можем добавлять Строки по мере выполнения программы ; Нет необходимости сначала создавать массив!
Обратитесь к нашей статье о StringJoiner для получения дополнительной информации и примеров.
6. Массивы.toString
Что касается массивов, то класс Array также содержит удобный toString метод, который хорошо форматирует массив объектов. Массивы . Метод toString также вызывает метод toString любого закрытого объекта – поэтому нам нужно убедиться, что он у нас определен.
String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"}; String toString = Arrays.toString(myFavouriteLanguages); assertEquals("[Java, JavaScript, Python]", toString);
К сожалению, массивы . toString метод не настраивается и выводит только Строку , заключенную в квадратные скобки.
7. Сборщики.присоединение (Java 8+)
Наконец, давайте взглянем на метод Collectors.joining , который позволяет нам направлять выходные данные потока в одну строку.
ListawesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo"); String animalString = awesomeAnimals.stream().collect(Collectors.joining(", ")); assertEquals("Shark, Panda, Armadillo", animalString);
Использование потоков открывает все функциональные возможности, связанные с потоком Java 8 API , такие как фильтрация, сопоставление, итерация и многое другое.
8. Заверните
В этой статье мы глубоко погрузились во множество классов и методов, используемых для объединения Строк в языке Java.
Как всегда, исходный код доступен на GitHub .