1. Metoda length(): ile znaków ma łańcuch?
Metoda length() zwraca liczbę znaków w łańcuchu. To nie do końca to samo, co „liczba bajtów” (zwłaszcza jeśli w łańcuchu są emoji lub znaki Unicode), ale w większości przypadków — właśnie to, czego potrzeba.
Przykład użycia
String name = "Vasilisa";
int length = name.length();
System.out.println("Liczba liter w imieniu: " + length); // 8
Po co to jest
- Sprawdzić, czy użytkownik nie wprowadził pustego łańcucha.
- Sprawdzić minimalną/maksymalną długość hasła.
- Sprawdzić, ile znaków pozostało do limitu (np. w SMS-ie lub tweecie).
Przykład: sprawdzanie pustego łańcucha
String input = "";
if (input.length() == 0)
{
System.out.println("Łańcuch jest pusty!");
}
Wskazówka: do sprawdzenia „pustości” łańcucha jest też metoda isEmpty(), ale o niej nieco później.
Krótkie FAQ
- Metoda length() nie przyjmuje argumentów (nawiasy są zawsze puste).
- Jeśli łańcuch składa się ze spacji, one również są liczone jako znaki!
- Jeśli łańcuch jest równy null, wywołanie length() spowoduje NullPointerException — najpierw sprawdź null.
2. Metoda substring(): wyodrębniamy część łańcucha
Metoda substring() pozwala uzyskać podłańcuch — „odciąć” fragment według podanych indeksów.
Istnieją dwie podstawowe formy wywołania:
- str.substring(startIndex) — od pozycji startIndex do końca łańcucha.
- str.substring(startIndex, endIndex) — od pozycji startIndex do endIndex (NIE wliczając znaku o indeksie endIndex).
Uwaga: indeksowanie znaków w łańcuchu zaczyna się od 0.
Przykłady użycia
Przykład 1: pobrać pierwsze trzy litery imienia
String name = "Vasilisa";
String firstThree = name.substring(0, 3); // "Vas"
System.out.println(firstThree);
Przykład 2: pobrać rozszerzenie pliku
String fileName = "document.pdf";
int dotIndex = fileName.indexOf(".");
String extension = fileName.substring(dotIndex + 1); // "pdf"
System.out.println(extension);
Przykład 3: ostatnie 4 znaki łańcucha
String cardNumber = "1234567890123456";
String lastFour = cardNumber.substring(cardNumber.length() - 4); // "3456"
System.out.println("Ostatnie 4 cyfry: " + lastFour);
Specyfika i niuanse
- Niepoprawne indeksy (startIndex < 0, endIndex > length, startIndex > endIndex) powodują StringIndexOutOfBoundsException.
- Metoda zawsze zwraca nowy łańcuch — oryginalny nie ulega zmianie.
- Druga forma (z dwoma parametrami) nie obejmuje znaku o indeksie endIndex.
String str = "abcdef";
// Indeksy: 0 1 2 3 4 5
str.substring(1, 4) → "bcd" // znaki o indeksach 1, 2, 3
substring(start, end)
3. Metoda indexOf(): szukamy znaku lub podłańcucha
Metoda indexOf() wyszukuje pozycję (indeks) pierwszego wystąpienia danego znaku lub podłańcucha.
- Jeśli znaleziono — zwraca indeks (od 0).
- Jeśli nie znaleziono — zwraca -1.
Przykłady użycia
Przykład 1: znaleźć pierwszą kropkę w adresie e-mail
String email = "ivan.petrov@mail.com";
int dotIndex = email.indexOf('.');
System.out.println("Pierwsza kropka na pozycji: " + dotIndex); // 4
Przykład 2: znaleźć podłańcuch
String text = "Kocham Java!";
int index = text.indexOf("Java");
System.out.println(index); // 7
Przykład 3: znaleźć znak po określonej pozycji
String s = "abracadabra";
int firstA = s.indexOf('a'); // 0
int secondA = s.indexOf('a', firstA + 1); // 3
System.out.println("Druga 'a' na pozycji: " + secondA);
Specyfika i niuanse
- Jeśli znak/podłańcuch występują wielokrotnie, zwracany jest indeks pierwszego wystąpienia.
- Aby znaleźć ostatnie wystąpienie, użyj lastIndexOf().
- Dla znaku używaj pojedynczych cudzysłowów: 'a'; dla podłańcucha — podwójnych: "abc".
Przykład: wyszukiwanie rozszerzenia pliku
String fileName = "report.final.version.docx";
int lastDot = fileName.lastIndexOf('.');
String extension = fileName.substring(lastDot + 1);
System.out.println("Rozszerzenie pliku: " + extension); // "docx"
4. Metoda charAt(): pobieramy znak według indeksu
Metoda charAt(index) zwraca znak łańcucha według jego indeksu.
Przykłady użycia
Przykład 1: sprawdzić pierwszą literę łańcucha
String city = "Minsk";
char first = city.charAt(0); // 'M'
System.out.println("Pierwsza litera: " + first);
Przykład 2: sprawdzić, czy łańcuch zaczyna się wielką literą
String word = "Java";
if (Character.isUpperCase(word.charAt(0)))
{
System.out.println("Słowo zaczyna się wielką literą!");
}
Przykład 3: przejść po wszystkich znakach łańcucha
String text = "Witaj";
for (int i = 0; i < text.length(); i++)
{
System.out.println("Znak #" + i + ": " + text.charAt(i));
}
Specyfika i niuanse
- Indeks poza zakresem (np. -1 lub >= length) spowoduje StringIndexOutOfBoundsException.
- Metoda zwraca wartość typu char, a nie łańcuch.
5. Metoda toCharArray(): przekształcamy łańcuch w tablicę znaków
Metoda toCharArray() — prosty sposób przekształcenia łańcucha w tablicę znaków (char[]). Przydatne do przetwarzania znak po znaku, sortowania, walidacji itp.
Przykład użycia:
String text = "Hello";
char[] characters = text.toCharArray();
for (char c : characters)
{
System.out.println(c);
}
// Wynik:
// H
// e
// l
// l
// o
Po co to:
- Przetwarzanie znaków: tablice są wygodniejsze do logiki znak po znaku (np. sprawdzanie anagramów).
- Zgodność: niektóre API oczekują char[] jako argumentu.
6. Metoda replace(): zamieniamy podłańcuchy
Metoda replace(CharSequence target, CharSequence replacement) zamienia wszystkie wystąpienia podłańcucha target na replacement. Zwraca nowy łańcuch, oryginalny nie ulega zmianie.
Przykład użycia:
String sentence = "Uwielbiam programowanie w Javie.";
String newSentence = sentence.replace("Java", "Java 25");
System.out.println(newSentence);
// Wynik: Uwielbiam programowanie w Javie 25.
String email = "support@company.com";
String cleanEmail = email.replace("@", "[at]");
System.out.println(cleanEmail);
// Wynik: support[at]company.com
Specyfika i niuanse
- Zamieniane są wszystkie wystąpienia.
- String jest niezmienny: replace() zwraca nowy łańcuch.
- Dla złożonych reguł użyj replaceAll() z wyrażeniem regularnym.
7. Metody trim() i strip(): pozbywamy się białych znaków
Obie metody usuwają „niewidoczne” znaki na początku i końcu łańcucha.
- trim() — klasyczna metoda: usuwa spacje, tabulacje, znaki nowej linii i część znaków sterujących, ale nie wszystkie spacje Unicode.
- strip() — nowoczesna metoda: uwzględnia wszystkie rodzaje spacji zgodnie ze standardem Unicode. Preferowana w nowych projektach.
Przykład użycia:
String s1 = " Witaj, świecie! ";
System.out.println(s1.trim());
// Wynik: "Witaj, świecie!"
String s2 = " \u2005 Java 11 \u2005 "; // \u2005 — to spacja Unicode
System.out.println("trim(): " + s2.trim());
System.out.println("strip(): " + s2.strip());
// Wynik:
// trim(): Java 11
// strip(): Java 11
Po co to:
- Oczyszczanie danych wejściowych użytkownika z nadmiarowych spacji.
- Normalizacja danych z plików/logów przed przetwarzaniem.
8. Praktyka: rozwiązujemy zadania
Zadanie 1: sprawdzenie długości hasła
String password = "qwerty";
if (password.length() < 8)
{
System.out.println("Hasło jest zbyt krótkie!");
}
else
{
System.out.println("Hasło jest w porządku.");
}
Zadanie 2: wyodrębnienie imienia z pełnego imienia i nazwiska
String fullName = "Ivanov Ivan Ivanovich";
int firstSpace = fullName.indexOf(' ');
String name = fullName.substring(firstSpace + 1, fullName.indexOf(' ', firstSpace + 1));
System.out.println("Imię: " + name); // "Ivan"
Zadanie 3: sprawdzenie, czy łańcuch zaczyna się od określonej litery
String surname = "Petrov";
if (surname.charAt(0) == 'P')
{
System.out.println("Nazwisko zaczyna się na literę P");
}
Zadanie 4: pobrać domenę z adresu e-mail
String email = "vasya.pupkin@gmail.com";
int at = email.indexOf('@');
String domain = email.substring(at + 1);
System.out.println("Domena: " + domain); // "gmail.com"
Zadanie 5: znaleźć wszystkie wystąpienia litery 'a' w łańcuchu
String s = "abrakadabra";
int pos = s.indexOf('a');
while (pos != -1)
{
System.out.println("Litera 'a' znaleziona na pozycji: " + pos);
pos = s.indexOf('a', pos + 1); // szukamy od ostatnio znalezionej pozycji
}
9. Typowe błędy przy pracy z metodami String
Błąd nr 1: wyjście poza granice łańcucha
Bardzo często myli się indeksy i odwołuje do nieistniejącego znaku/podłańcucha.
String s = "Java";
char c = s.charAt(4); // Błąd! Indeksy 0..3
String s = "Hello";
String sub = s.substring(3, 10); // Błąd! Długość łańcucha — 5
Błąd nr 2: zamieszanie z włączaniem/wyłączaniem indeksu
Metoda substring(start, end) wlicza znak o indeksie start, ale NIE wlicza znaku o indeksie end.
Błąd nr 3: oczekiwanie, że indexOf zwróci coś innego niż -1, gdy podłańcuch nie występuje
Sprawdzaj wynik przed użyciem, zwłaszcza jeśli potem wykorzystujesz go w substring.
Błąd nr 4: nieprawidłowe traktowanie pustych łańcuchów
Jeśli łańcuch jest pusty (""), wywołania charAt(0) lub substring(0, 1) spowodują błąd. Najpierw sprawdź długość.
Błąd nr 5: praca z łańcuchami null
Jeśli łańcuch jest równy null, wywołanie dowolnej metody (length(), substring() itd.) spowoduje NullPointerException. Zawsze sprawdzaj null przed przetwarzaniem.
GO TO FULL VERSION