Об'єднання рядків у Java

1. Вступ

Java забезпечує значну кількість методів та класів, присвячених об'єднанню рядків.

У цьому підручнику ми розглянемо декілька з них, а також окреслимо деякі загальні підводні камені та погані практики.

2. StringBuilder

Перший - скромний StringBuilder. Цей клас надає широкий спектр 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 . Хоча окремі дзвінки до синхронізованого методу є безпечними для потоку, багаторазові - ні.

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. Колекціонери . Приєднання (Java 8+)

Нарешті, давайте поглянемо на метод Collectors.joining, який дозволяє нам передати вихід потоку в один рядок.

List awesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo"); String animalString = awesomeAnimals.stream().collect(Collectors.joining(", ")); assertEquals("Shark, Panda, Armadillo", animalString);

Використання потоків розблоковує всі функціональні можливості, пов’язані з API Java 8 Stream , такі як фільтрація, зіставлення, ітерація тощо.

8. Загорнути

У цій статті ми глибоко заглибились у безліч класів і методів, що використовуються для об’єднання рядківмовою Java.

Як завжди, вихідний код доступний на GitHub.