Concatenarea șirurilor în Java

1. Introducere

Java oferă un număr substanțial de metode și clase dedicate concatenării șirurilor .

În acest tutorial, ne vom scufunda în mai multe dintre ele, precum și vom prezenta câteva capcane comune și practici proaste.

2. StringBuilder

Primul este umilul StringBuilder. Această clasă oferă o gamă largă de String construirea de utilități , care face munca usoara de String manipulare.

Să construim un exemplu rapid de concatenare String folosind clasa StringBuilder :

StringBuilder stringBuilder = new StringBuilder(100); stringBuilder.append("Baeldung"); stringBuilder.append(" is"); stringBuilder.append(" awesome"); assertEquals("Baeldung is awesome", stringBuilder.toString());

Pe plan intern, StringBuilder menține o serie de caractere mutabile. În exemplul nostru de cod, am declarat că aceasta are o dimensiune inițială de 100 prin intermediul constructorului StringBuilder . Datorită acestei declarații de dimensiune, StringBuilder poate fi un mod foarte eficient de a concatena șiruri .

De asemenea, merită remarcat faptul că clasa StringBuffer este versiunea sincronizată a StringBuilder .

Deși sincronizarea este adesea sinonimă cu siguranța firelor, nu este recomandată pentru utilizare în aplicații cu mai multe fire din cauza modelului de generare StringBuffer . În timp ce apelurile individuale către o metodă sincronizată sunt sigure pentru fire, apelurile multiple nu sunt.

3. Operator de adăugare

Următorul este operatorul de adăugare (+). Acesta este același operator care are ca rezultat adăugarea de numere și este suprasolicitat pentru a concatena atunci când este aplicat la Strings.

Să aruncăm o privire rapidă asupra modului în care funcționează:

String myString = "The " + "quick " + "brown " + "fox..."; assertEquals("The quick brown fox...", myString);

La prima vedere, acest lucru poate părea mult mai concis decât opțiunea StringBuilder . Cu toate acestea, când se compilează codul sursă, simbolul + se traduce în lanțuri de apeluri StringBuilder.append () . Datorită acestui fapt, amestecarea metodei de concatenare StringBuilder și + este considerată o practică proastă .

În plus, ar trebui evitată concatenarea șirului folosind operatorul + într-o buclă. Deoarece obiectul String este imuabil, fiecare apel pentru concatenare va duce la crearea unui nou obiect String .

4. Metode de șir

String clasa în sine oferă o întreagă serie de metode pentru concatenarea siruri de caractere.

4.1. String.concat

În mod surprinzător, metoda String.concat este primul nostru port de apel atunci când încercăm să concatenăm obiecte String . Această metodă returnează un obiect String , astfel încât înlănțuirea metodei este o caracteristică utilă.

String myString = "Both".concat(" fickle") .concat(" dwarves") .concat(" jinx") .concat(" my") .concat(" pig") .concat(" quiz"); assertEquals("Both fickle dwarves jinx my pig quiz", myString);

În acest exemplu, lanțul nostru este început cu un literal String , metoda concat ne permite apoi să lanțăm apelurile pentru a adăuga mai multe șiruri .

4.2. String.format

Urmează metoda String.format , care ne permite să injectăm o varietate de obiecte Java într-un șablon String .

String.format Semnătura metodă are un singur șir care indică șablonul nostru . Acest șablon conține caractere „%” pentru a reprezenta unde sunt diferitele obiectear trebui să fie plasate în interiorul său.

Odată ce șablonul nostru este declarat, acesta ia apoi o matrice de obiecte varargs care este injectată în șablon.

Să vedem cum funcționează acest lucru cu un exemplu rapid:

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);

După cum putem vedea mai sus, metoda ne-a injectat șirurile în formatul corect.

4.3. String.join (Java 8+)

Dacă aplicația noastră rulează pe Java 8 sau mai sus , putem profita de metoda String.join . Cu aceasta, putem uni o serie de șiruri cu un delimitator comun , asigurându-ne că nu se pierd spații.

String[] strings = {"I'm", "running", "out", "of", "pangrams!"}; String myString = String.join(" ", strings); assertEquals("I'm running out of pangrams!", myString); 

Un avantaj imens al acestei metode este că nu trebuie să vă faceți griji cu privire la delimitatorul dintre șirurile noastre.

5. StringJoiner (Java 8+)

StringJoiner abstractizează toate funcționalitățile String.join într-o clasă simplă de utilizat. Constructorul ia un delimitator, opțional cu un prefix și sufix . Putem adăuga șiruri folosind metoda adăugată bine numită .

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

Prin utilizarea acestei clase, în loc de metoda String.join , putem adăuga șiruri pe măsură ce rulează programul ; Nu este nevoie să creați mai întâi matricea!

Accesați articolul nostru despre StringJoiner pentru mai multe informații și exemple.

6. Matrice.toString

În ceea ce privește matricea, clasa Array conține, de asemenea, o metodă toString la îndemână, care formează frumos o serie de obiecte. The Arrays. metoda toString apelează și metoda toString a oricărui obiect închis - deci trebuie să ne asigurăm că avem unul definit.

String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"}; String toString = Arrays.toString(myFavouriteLanguages); assertEquals("[Java, JavaScript, Python]", toString);

Din păcate, matricea. Metoda toString nu este personalizabilă și scoate doar un șir încadrat între paranteze drepte.

7. Collectors.joining (Java 8+)

În cele din urmă, să aruncăm o privire la metoda Collectors.joining care ne permite să canalizăm ieșirea unui flux într-un singur șir.

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

Utilizarea fluxurilor deblochează toate funcționalitățile asociate cu API-ul Java 8 Stream , cum ar fi filtrarea, maparea, iterarea și multe altele.

8. Încheiați

În acest articol, ne - am luat o scufundare adânc în multitudinea de clase și metode folosite pentru a înlănțui siruri de caractereîn limbajul Java.

Ca întotdeauna, codul sursă este disponibil pe GitHub.