Обединяване на низове в Java

1. Въведение

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

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

2. StringBuilder

Първо е скромният StringBuilder. Този клас предоставя набор от String- изграждане на комунални услуги , които прави лесно работа на 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 на конструктора. Докато отделните повиквания към синхронизиран метод са безопасни за нишки, многократни повиквания не са.

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.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 подписа метод отнема единствен String обозначаващ нашия шаблон . Този шаблон съдържа символи „%“, за да представи къде са различните обектитрябва да се постави в него.

След като шаблонът ни бъде деклариран, той взема масив от обекти на 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);

Както можем да видим по-горе, методът е инжектиран нашите Strings в правилния формат.

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 в лесен за използване клас. В конструктора отнема разделител, с допълнителен префикс и суфикс . Можем да добавим низове, използвайки добре наречения метод за добавяне .

StringJoiner fruitJoiner = new StringJoiner(", "); fruitJoiner.add("Apples"); fruitJoiner.add("Oranges"); fruitJoiner.add("Bananas"); assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString());

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

Обърнете се към нашата статия за StringJoiner за повече информация и примери.

6. Arrays.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);

Използването на потоци отключва цялата функционалност, свързана с Java 8 Stream API, като филтриране, картографиране, итерация и др.

8. Увийте

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

Както винаги, изходният код е достъпен в GitHub.