Łączenie ciągów w Javie

1. Wstęp

Java udostępnia znaczną liczbę metod i klas przeznaczonych do łączenia ciągów znaków .

W tym samouczku omówimy kilka z nich, a także przedstawimy niektóre typowe pułapki i złe praktyki.

2. StringBuilder

Najpierw jest skromny StringBuilder. Ta klasa udostępnia szereg narzędzi do budowania ciągów znaków, które ułatwiają manipulowanie ciągami znaków.

Build Chodźmy szybkie przykładem String konkatenacji przy użyciu StringBuilder klasy:

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

Wewnętrznie StringBuilder utrzymuje zmienną tablicę znaków. W naszym przykładowym kodzie zadeklarowaliśmy, że ma to początkowy rozmiar 100 za pośrednictwem konstruktora StringBuilder . Ze względu na tę deklarację rozmiaru StringBuilder może być bardzo wydajnym sposobem łączenia ciągów .

Warto również zauważyć, że klasa StringBuffer jest zsynchronizowaną wersją klasy StringBuilder .

Chociaż synchronizacja jest często synonimem bezpieczeństwa wątków, nie jest zalecana do użytku w aplikacjach wielowątkowych ze względu na wzorzec konstruktora StringBuffer . Podczas gdy poszczególne wywołania metody synchronicznej są bezpieczne wątkowo, wiele wywołań nie.

3. Operator dodawania

Następny jest operator dodawania (+). Jest to ten sam operator, który powoduje dodanie liczb i jest przeciążany w celu konkatenacji po zastosowaniu do ciągów.

Rzućmy okiem na to, jak to działa:

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

Na pierwszy rzut oka może się to wydawać znacznie bardziej zwięzłe niż opcja StringBuilder . Jednak podczas kompilacji kodu źródłowego symbol + jest tłumaczony na łańcuchy wywołań StringBuilder.append () . Z tego powodu mieszanie metody konkatenacji StringBuilder i + jest uważane za złą praktykę .

Ponadto należy unikać konkatenacji ciągów znaków przy użyciu operatora + w pętli. Ponieważ obiekt String jest niezmienny, każde wywołanie konkatenacji spowoduje utworzenie nowego obiektu String .

4. Metody ciągów

Sama klasa String zapewnia cały szereg metod do łączenia ciągów znaków .

4.1. String.concat

Nic dziwnego, że metoda String.concat jest naszym pierwszym portem wywołania podczas próby konkatenacji obiektów String . Ta metoda zwraca obiekt String , więc połączenie metody w łańcuch jest przydatną funkcją.

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

W tym przykładzie nasz łańcuch rozpoczyna się od literału String , a metoda concat pozwala nam następnie połączyć wywołania w celu dołączenia kolejnych ciągów .

4.2. String.format

Następna jest metoda String.format , która pozwala nam wstrzykiwać różne obiekty Java do szablonu String .

String.Format podpis metoda przyjmuje jeden ciąg oznaczający nasz szablon . Ten szablon zawiera znaki „%”, które mają oznaczać, gdzie znajdują się różne obiektynależy w nim umieścić .

Po zadeklarowaniu naszego szablonu pobiera on tablicę Object varargs, która jest wstrzykiwana do szablonu.

Zobaczmy, jak to działa na krótkim przykładzie:

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

Jak widać powyżej, metoda wstrzyknęła nasze ciągi do odpowiedniego formatu.

4.3. String.join (Java 8+)

Jeśli nasza aplikacja działa na Javie 8 lub nowszym , możemy skorzystać z metody String.join . Dzięki temu możemy połączyć tablicę ciągów ze wspólnym separatorem , zapewniając, że żadne spacje nie zostaną pominięte.

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

Ogromną zaletą tej metody jest brak konieczności martwienia się o separator między naszymi ciągami.

5. StringJoiner (Java 8+)

StringJoiner abstrahuje całą funkcjonalność String.join do prostej w użyciu klasy. Konstruktor wykonuje separatora, z opcjonalnym prefiks i sufiks . Ciągi możemy dołączać za pomocą dobrze nazwanej metody add .

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

Używając tej klasy, zamiast metody String.join , możemy dołączać ciągi znaków w trakcie działania programu ; Nie ma potrzeby wcześniejszego tworzenia tablicy!

Przejdź do naszego artykułu na temat StringJoiner, aby uzyskać więcej informacji i przykładów.

6. Arrays.toString

Jeśli chodzi o tablice, klasa Array zawiera również przydatną metodę toString , która ładnie formatuje tablicę obiektów. W tablicach. ToString wywołuje również metodę toString dowolnego obiektu zamkniętego - musimy więc upewnić się, że mamy zdefiniowany.

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

Niestety, plik Arrays. toString nie można dostosowywać i wyprowadza tylko String w nawiasach kwadratowych.

7. Collectors.joining (Java 8+)

Na koniec przyjrzyjmy się metodzie Collectors.joining , która pozwala nam przelać dane wyjściowe Stream do pojedynczego ciągu .

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

Korzystanie ze strumieni odblokowuje wszystkie funkcje związane z Java 8 Stream API, takie jak filtrowanie, mapowanie, iterowanie i inne.

8. Podsumuj

W tym artykule szczegółowo omówiliśmy wiele klas i metod używanych do łączenia ciągów znakóww języku Java.

Jak zawsze, kod źródłowy jest dostępny na GitHub.