"Witaj, Amigo!"

"Cześć Rysiu!"

„Teraz wiesz już wystarczająco dużo o ciągach znaków, aby dowiedzieć się czegoś interesującego. Dokładniej, nowej klasy, która jest podobna do klasy String, ale nie do końca taka sama”.

„Brzmi intrygująco, chociaż nie jest dla mnie do końca jasne, dlaczego zwykłe struny zawodzą i dlaczego potrzebne są inne klasy podobne do strun”.

„Zacznijmy od tego, że łańcuchy znaków są niezmiennymi obiektami w Javie”.

„Jak to? Zapomniałem… Albo nigdy nie wiedziałem, od czego zacząć…”

„Przypomnę, że obiekty niezmienne to te, których stanu nie można zmienić po utworzeniu”.

„Ahhh… Dlaczego ciągi znaków są niezmienne w Javie?”

„Zrobiono to, aby klasa String była wysoce zoptymalizowana i aby można było jej używać wszędzie. Na przykład jako klucze w kolekcji HashMap zaleca się stosowanie tylko niezmiennych typów .

„Jednak często pojawiają się sytuacje, w których programiści uznaliby, że wygodniej jest, aby klasa String była zmienna. Chcą klasy, która nie tworzy nowego podłańcucha za każdym razem, gdy wywoływana jest jedna z jej metod”.

— Ale do czego to służy?

„Cóż, załóżmy, że mamy bardzo duży ciąg znaków i musimy często dodawać coś na jego końcu. W takim przypadku nawet zbiór znaków ( ArrayList<Character>) może być bardziej wydajny niż ciągłe odtwarzanie i łączenie obiektów typu String”.

„I dlatego potrzebujemy łańcuchów, które nie są klasą String?”

„Dokładnie. Język Java dodał typ podobny do łańcucha, który można zmienić. Nazywa się on StringBuilder„.

Tworzenie obiektu

„Aby utworzyć StringBuilderobiekt na podstawie istniejącego ciągu, musisz wykonać instrukcję taką jak:

StringBuilder name = new StringBuilder(string);

„Aby utworzyć pusty zmienny ciąg znaków, musisz użyć następującej instrukcji:

StringBuilder name = new StringBuilder();

Lista metod

StringBuilderKlasa ma dwa tuziny pomocnych metod. Oto najważniejsze z nich:

metoda Opis
StringBuilder append(obj)
Konwertuje przekazany obiekt na ciąg i dołącza go do bieżącego ciągu
StringBuilder insert(int index, obj)
Konwertuje przekazany obiekt na ciąg i wstawia w środku bieżącego ciągu
StringBuilder replace(int start, int end, String str)
Zamienia część ciągu określoną przez interwał początkowy..końcowy na przekazany ciąg
StringBuilder deleteCharAt(int index)
Usuwa znak o określonym indeksie z ciągu
StringBuilder delete(int start, int end)
Usuwa znaki w określonym przedziale z ciągu
int indexOf(String str, int index)
Wyszukuje podłańcuch w bieżącym ciągu
int lastIndexOf(String str, int index)
Wyszukuje podłańcuch w bieżącym ciągu, zaczynając od końca
char charAt(int index)
Zwraca znak w łańcuchu w przekazanym indeksie
String substring(int start, int end)
Zwraca podłańcuch zdefiniowany przez określony interwał
StringBuilder reverse()
Odwraca bieżący ciąg.
void setCharAt(int index, char)
Zmienia znak o określonym indeksie na przekazany znak
int length()
Zwraca długość ciągu w znakach

„A teraz pokrótce opiszę wam każdą z tych metod.

Dołączanie do ciągu

„Aby dodać coś do zmiennego ciągu znaków ( StringBuilder), użyj append()metody. Przykład:

Kod Opis
StringBuilder builder = new StringBuilder("Hi");
builder.append("Bye");
builder.append(123);
Hi
HiBye
HiBye123

Konwersja na standardowy ciąg

„Aby przekonwertować StringBuilderobiekt na obiekt typu String, wystarczy wywołać jego toString()metodę. Przykład

Kod Wyjście
StringBuilder builder = new StringBuilder("Hi");
builder.append(123);
String result = builder.toString();
System.out.println(result);
Hi123

Jak usunąć postać?

„Aby usunąć znak w zmiennym łańcuchu, musisz użyć deleteCharAt()metody. Przykład:

Kod Wyjście
StringBuilder builder = new StringBuilder("Hello");
builder.deleteCharAt(2);
String result = builder.toString();
System.out.println(result);
Helo

Jak zamienić część ciągu na inny ciąg?

„Na to jest replace(int begin, int end, String str)metoda. Przykład:

Kod Wyjście
StringBuilder builder = new StringBuilder("Mellow");
builder.replace(2, 5, "Hello!");
String result = builder.toString();
System.out.println(result);
MeHello

„Brzmi wygodnie. Dziękuję, Rishi”.

„Nie wspominaj o tym. A może odwrócisz sznurek? Jak byś to zrobił?”

„Cóż… stworzyłbym StringBuilder, umieściłbym w nim ciąg znaków… Następnie utworzyłbym nowy ciąg znaków iw pętli od ostatniego znaku do pierwszego… A może przesunięcie bitowe…

„Nieźle. Ale mogłoby być szybciej. Jest na to specjalna metoda — reverse();przykład:

Kod Wyjście
String str = "Hello";
StringBuilder builder = new StringBuilder(str);
builder.reverse();
String result = builder.toString();
System.out.println(result);
olleH

„Oprócz StringBuilderklasy Java ma inną klasę podobną do łańcucha o nazwie StringBuffer. Jest to odpowiednik StringBuilderklasy, ale jej metody są oznaczone modyfikatorem synchronized”.

"Co to znaczy?"

„Oznacza to, że StringBufferdostęp do obiektu można uzyskać jednocześnie z wielu wątków”.

„Nie jestem jeszcze zaznajomiony z wątkami. Ale „można uzyskać dostęp z wielu wątków” jest wyraźnie lepsze niż „nie można uzyskać dostępu z wielu wątków”… Dlaczego więc nie zawsze używać? StringBuffer

„Ponieważ jest znacznie wolniejszy niż StringBuilder. Możesz potrzebować takiej klasy, gdy zaczniesz aktywnie eksplorować wielowątkowość w zadaniu Java Multithreading .

— Zapiszę to sobie w pamięci, żeby nie zapomnieć. Z dopiskiem „na przyszłość”.