Menu

Stringi w Javie: tworzenie, łączenie i metody klasy String

Jak działają stringi w Javie: tworzenie, łączenie przez +, dlaczego są niezmienne, porównywanie przez equals i codzienne metody klasy String, takie jak length, substring i replace.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Czym jest String

String przechowuje ciąg znaków, czyli tekst, np. imię, zdanie albo linię odczytaną z pliku. Na poprzedniej stronie String pojawił się na liście typów referencyjnych; tutaj naprawdę zaczniesz z nim pracować. Literał napisu zapisujesz w cudzysłowie podwójnym (apostrofy są zarezerwowane dla pojedynczego char):

name.length() zwraca liczbę znaków: 3 dla "Ada". To wywołanie metody, więc potrzebuje nawiasów.

Łączenie napisów

Operator + skleja napisy. Jeśli po którejś stronie + jest napis, druga strona jest automatycznie zamieniana na tekst, więc możesz bez dodatkowej pracy mieszać liczby i wartości logiczne:

Jedna pułapka: ponieważ + działa od lewej do prawej, "" + 1 + 2 daje "12" (napis + int, potem napis + int), a 1 + 2 + "" daje "3" (dwie liczby int najpierw się dodają, a potem stają się tekstem). W razie wątpliwości otocz działania arytmetyczne nawiasami.

Stringi są niezmienne

To najważniejsza rzecz do zrozumienia w stringach Javy: String nigdy nie zmienia się po utworzeniu. Każda metoda, która "modyfikuje" napis, w rzeczywistości zwraca zupełnie nowy napis i zostawia oryginał nietknięty. Jeśli więc zapomnisz przechwycić zwracaną wartość, nic się nie stanie:

Pierwsze wywołanie oblicza "HELLO" i od razu je wyrzuca. Widoczny efekt ma tylko druga linia, która przypisuje wynik z powrotem do s. Prawie każdy raz się na tym potyka.

Porównywanie napisów

Do porównania zawartości dwóch napisów używaj .equals(). Sięgnięcie po == to klasyczny błąd początkujących: == pyta "czy to ten sam obiekt w pamięci?", a nie "czy zawierają ten sam tekst?":

a == b to tutaj false, bo new String(...) wymusza osobny obiekt. Wartości napisów zawsze porównuj przez .equals() (albo .equalsIgnoreCase(), żeby zignorować wielkość liter). Przydatna sztuczka, żeby uniknąć awarii, gdy jedna strona może być null, to wywołanie .equals na literale: "yes".equals(input) nigdy nie rzuca wyjątku, nawet gdy input to null.

Codzienne metody String

Ponieważ napisy są niezmienne, każda z tych metod zwraca nowy napis (albo wartość) zamiast zmieniać oryginał. To te, po które będziesz sięgać cały czas:

Zwróć uwagę na łańcuchowanie: s.trim().toUpperCase() działa, bo trim() zwraca napis, na którym potem wywołujesz toUpperCase(). substring to kolejne podstawowe narzędzie: przyjmuje indeks początkowy (włącznie) i opcjonalny indeks końcowy (wyłącznie):

Indeksy liczy się od zera, więc substring(0, 4) bierze znaki od 0 do 3. Prośba o indeks poza końcem rzuca StringIndexOutOfBoundsException, jeden z wyjątków czasu działania, przed którymi można się zabezpieczyć. Zauważ też, że split(",") powyżej zwraca tablicę, w której length to pole bez nawiasów, w odróżnieniu od metody .length() na napisie.

Budowanie napisów w pętli

Łączenie przez + sprawdza się przy kilku kawałkach, ale w dużej pętli jest wolne: każde + tworzy nowy napis i kopiuje wszystko. Gdy składasz tekst w pętli, użyj StringBuilder, który zmienia bufor w miejscu i tworzy końcowy napis raz, na samym końcu:

append zwraca ten sam builder, więc wywołania można łączyć w łańcuch. Na końcu wywołaj .toString(), żeby dostać zwykły String. Przy jednorazowym łączeniu zostań przy +; do zbierania wielu kawałków właściwym narzędziem jest StringBuilder.

Dalej: formatowanie napisów

Konkatenacja robi się nieporęczna, gdy potrzebujesz wyrównanych kolumn, stałej liczby miejsc po przecinku albo liczb dopełnionych zerami. String.format i printf w Javie używają szablonu z miejscami oznaczonymi %, żeby czysto obsłużyć to wszystko. O tym jest następna strona.

Najczęściej zadawane pytania

Jak porównać dwa stringi w Javie?

Do porównania zawartości użyj .equals(): a.equals(b) zwraca true, gdy znaki się zgadzają. Nie używaj == do porównywania wartości napisów: == porównuje referencje obiektów, więc może zwrócić false dla dwóch napisów z tym samym tekstem. Użyj .equalsIgnoreCase(), gdy wielkość liter nie ma znaczenia.

Dlaczego stringi w Javie są niezmienne?

Raz utworzony obiekt String nigdy się nie zmienia. Metody takie jak replace czy toUpperCase zwracają nowy napis zamiast zmieniać oryginał. Niezmienność sprawia, że napisy można bezpiecznie współdzielić i przechowywać w pamięci podręcznej, ale oznacza też, że trzeba przypisać wynik: s = s.toUpperCase();. Jeśli wywołasz metodę i zignorujesz zwracaną wartość, nic się nie stanie.

Jak sprawdzić długość stringa w Javie?

Wywołaj metodę .length(): "hello".length() zwraca 5. To metoda z nawiasami na obiekcie String, w odróżnieniu od tablic, gdzie length to pole bez nawiasów (arr.length).

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ