Klasa String służy do tworzenia obiektów znakowych. Nie ma „prostego” typu String.
Deklaracja łańcucha znaków:
String napis1 = "Hello World!";
lub
String napis2 = new String("Hello My World!");
Należy zapamiętać, że samo wykonanie operacji zmieniającej wartość łańcucha znaków, nie powoduje zapamiętania tej zmiany w programie, należy zmieniony ciąg przypisać do zmiennej. To tzw. niemutowalność ciągów.
Podobnie jak w przypadku Integera, klasa String ma mnóstwo dostępnych funkcji wbudowanych, gotowych do użycia. Oto kilka z nich:
toString()
ta metoda zwraca łańcuch, który „tekstowo reprezentuje” dany obiekt. Zaleca się, aby wszystkie podklasy zastępowały tę metodę. Szerzej o wykorzystaniu tej metody w późniejszych lekcjach.
String napis3 = "Kolejny nudny przykład.";
String s3 = napis3.toString();
System.out.println(s3);
valueOf()
konwertuje różne typy zmiennych na łańcuchy. Za jej pomocą można przekonwertować int na string, long na string, boolean na string, character to string, float to string, double to string, object to string and char array to string.
boolean bol = true;
int liczba = 10;
System.out.println("bool na string: " + String.valueOf(bol));
System.out.println("int na string: " + String.valueOf(liczba));
//itd....
Powtarzanie ciągu: repeat()
String repeatString = napis1.repeat(3);
System.out.println(repeatString);
Łączenie ciągów: +, concat(), join()
//łączenie za pomocą +
System.out.println(napis1 + " złączony + z " + napis2);
//łączenie za pomocą konkatenacji
System.out.println(napis1.concat(" złączony concat() z " + napis2));
//łączenie funkcją join
String joinStrings = String.join(" - ", napis1, napis2, "to było połączenie");
System.out.println(joinStrings);
//łączenie różnych typów danych
String s1 = "napis";
int l1 = 10;
String zlacz_plus = s1 + l1;
System.out.println(zlacz_plus); //ok
//String zlacz_concat = s1.concat(l1);//błąd - musimy przekonwertować int na String
String zlacz_concat = s1.concat(Integer.toString(l1));//ok
System.out.println(zlacz_concat);
String zlacz_join = String.join(" ", s1, Integer.toString(l1)); // tak jak powyżej, należy zmienić typ zmiennej
System.out.println(zlacz_join);
Klasa StringBuilder
to klasa, która pomaga łączyć wiele ciągów w aplikacjach jednowątkowych jej użycie jest wskazane, gdyż nie obciąża Garbage Collectora tak jak pozostałe operacje łączenia (istnieje jeszcze StringBuffer dla aplikacji wielowątkowych).
StringBuilder stringBuilder = new StringBuilder("Info: "); //tworzymy obiekt stringBuilder
stringBuilder.append(napis1); //dodaję do obiektu kolejny element
stringBuilder.append(" ");
stringBuilder.append(napis2);
stringBuilder.append(" ");
stringBuilder.append(napis3);
String calosc = stringBuilder.toString();
System.out.println(calosc);
Zmiana ciągu znaków na inny: replace() i replaceAll
//zmiana fragmentu ciągu na inny
String txt = napis1.replaceAll("pierwszy", "zmieniony");
System.out.println(txt);
String txt1 = "Dog makes miau miau";
System.out.println(txt1.replaceAll("miau", "hau"));
//replaceAll zmienia wszystkie wystąpienia podanej sekwencji znaków, bez wzglęcu na to czy są to całe wyrazy, czy nie
System.out.println(txt1.replaceAll("mi", "h"));
//zmiana pierwszego wystąpienia:
System.out.println(txt1.replaceFirst("miau", "hau"));
Porównywanie ciągów: ==, equals() i compareTo()
ciągów znaków nie porównujemy jak typów prostych za pomocą ==, ponieważ porównanie to wskazuje jedynie czy porównywane elementy są w tej samej lokalizacji w pamięci. Przy porównywaniu ciągów znaków w ten sposób
możemy otrzymać fałszywie dodatnie wyniki. Do porównywania ciągów należy używać instrukcji equals()
String n1 = "Hello";
String n_temp = "He";
String n2 = n_temp + "llo";
String n3 = "Hello";
String n4 = "HELLO";
System.out.println(n1==n3); //działa przy małych ciągach
System.out.println(n1==n2); //błędnie wskazuje false
//Porównanie treści
// equals - ważna wielkość liter
//zwracana jest wartość boolean
System.out.println("Wykorzystanie equals: " + n1.equals(n2));
System.out.println("Wykorzystanie equals: " + n1.equals(n4));
//Porównanie treści - equalsIgnoreCase - nie ważna wielkość liter
System.out.println("Wykorzystanie equalsIgnoreCase: " + n2.equalsIgnoreCase(n4));
//compareTo i CompareToIgnoreCase
//zwraca wartość liczbową 0 dla true
System.out.println("Wykorzystanie compareTo: " + n1.compareTo(n2));
System.out.println("Wykorzystanie compareTo: " + n1.compareTo(n4));
//Porównanie treści - compareToIgnoreCase - nie ważna wielkość liter
System.out.println("Wykorzystanie compareToIgnoreCase: " + n2.compareToIgnoreCase(n4));
isBlank() i isEmpty – puste ciągi
isBlank – zwraca true jeżeli ciąg zawiera białe znaki lub jego długość to 0
isEmpty – zwraca true jeżeli jego długość to 0
String blank_str = " \n ";
String empty_str = "";
System.out.println("blank_str.isBlank() daje " + blank_str.isBlank()); //true
System.out.println("empty_str.isBlank() daje " + empty_str.isBlank()); //true
System.out.println("blank_str.isEmpty() daje " + blank_str.isEmpty()); //false
System.out.println("empty_str.isEmpty() daje " + empty_str.isEmpty()); //true
Określanie długości ciągu – length()
w przypadku length należy pamiętać, że nie wolno używać tej funkcji na obiekcie, który ma przypisany „null” – wygeneruje to błąd. Można natomiast stosować length do zmiennej, której wartość została zadeklarowana jako „”
System.out.println("Długość zdania \"" + napis1 + "\" to: " + napis1.length() + " znaki.");
charAt – wartość kryjąca się pod konkretnym indexem
System.out.println("Znak w indeksie 0 zdania \"" + napis1 + "\" to: " + napis1.charAt(0));
substring() – wycinanie fragmentów ciągu
String text1 = "abcdef";
System.out.println(text1.substring(3, 5)); // zwraca "de"
System.out.println(text1.substring(0, 2)); // zwraca "ab"
System.out.println(text1.substring(2)); // zwraca "cdef"
System.out.println(text1.substring(1)); // bcdef
System.out.println(text1.substring(1, 3)); // bc
System.out.println(text1.substring(0, 4)); // abcd
Wyszukiwanie fragmentów w ciągu – indexOf(), lastIndexOf(), startsWith(), endsWith()
//indexOf - wyszukanie pierwszego wystąpienia tekstu w łańcuchu, jeżeli go nie ma to zwróci -1
String wystapienie = "Ala ma kota, a kot ma Alę.";
System.out.println("wystapienie.indexOf(\"kota\") zwraca " + wystapienie.indexOf("kota"));
System.out.println("wystapienie.indexOf(\"ta\") zwraca " + wystapienie.indexOf("ta"));
System.out.println("wystapienie.indexOf(\"x\") zwraca " + wystapienie.indexOf("x"));
//możemy wskazać index od którego zaczniemy szukać
System.out.println("wystapienie.indexOf(\"kot\", 11) zwraca " + wystapienie.indexOf("kot", 11));
System.out.println("wystapienie.indexOf(\"kot\", 16) zwraca " + wystapienie.indexOf("kot", 16));
//lastIndexOf - wyszukanie pierwszego wystąpienia tekstu w łańcuchu licząc od końca, jeżeli go nie ma to zwróci -1
System.out.println("wystapienie.lastIndexOf(\"kot\") zwraca " + wystapienie.lastIndexOf("kot"));
System.out.println("wystapienie.lastIndexOf(\"ta\") zwraca " + wystapienie.lastIndexOf("ta"));
System.out.println("wystapienie.lastIndexOf(\"x\") zwraca " + wystapienie.lastIndexOf("x"));
//możemy wskazać index od którego zaczniemy szukać
System.out.println("wystapienie.lastIndexOf(\"kot\", 11) zwraca " + wystapienie.lastIndexOf("kot", 11));
System.out.println("wystapienie.lastIndexOf(\"kot\", 16) zwraca " + wystapienie.lastIndexOf("kot", 16));
//startsWith - zwraca true jeżeli podany ciąg zaczyna się od podanego wzorca
//endsWith - zwraca true jeżeli podany ciąg kończy się na podany wzorzec
//----------------------------
String startend = "Ala ma kota.";
System.out.println("startend.startsWith(\"Ala\") daje " + startend.startsWith("Ala")); //true
System.out.println("startend.startsWith(\"kot\") daje " + startend.startsWith("kot")); //false
System.out.println("startend.endsWith(\"ta.\") daje " + startend.endsWith("ta.")); //true
System.out.println("startend.endsWith(\"a\") daje " + startend.endsWith("a")); //false
Usuwanie białych znaków – trim(), stripLeading(), stripTrailing()
String text = " To jest tekst z białymi znakami. ";
//trim() - usuwa białe znaki na pcczątku i na końcu ciągu
System.out.println(text.trim());
//stripLeading - usuwa białe znaki na pcczątku ciągu
System.out.println(text.stripLeading());
//stripTrailing - usuwa białe znaki na końcu ciągu
System.out.println(text.stripTrailing());
Zmiana wielkości liter w ciągach – toLowerCase(), toUpperCase()
Funkcje(metody) zmieniające wielkość znaków w ciągu, odpowiednio na małe lub duże litery
System.out.println(text1.toUpperCase());
System.out.println(text1.toLowerCase());
Łączenie metod
Czasami zachodzi potrzeba wykorzystania wielu metod na jednym ciągu (nie tyczy się to jedynie String)
//przykład zmiany całego ciągu na "Jak w zdaniu"
String zdanie = " tO jest Przykładowe zdAnie. ";
System.out.println(zdanie.trim().substring(0,1).toUpperCase()+zdanie.trim().substring(1).toLowerCase());
split() oraz toCharArray()
dzielą ciąg znaków na tablicę i zostaną omówione w temacie Tablice
Zadanie 1:
Napisz program, który wczyta od użytkownika jeden wyraz i wypisz liczbę znaków, z których się składa. Dla przykładu, dla podanego słowa nauka wypisze 5.
Zadanie 2:
Napisz program, który z podanego tekstu:
text = 'JAVA jest popularnym językiem programowania’
wytnie dokładnie cztery pierwsze wyrazy. Przeprowadź standaryzację każdego wyrazu, tzn. zamień duże litery na małe. Wynik przedstaw w postaci listy i wydrukuj do konsoli.
Oczekiwany wynik:
[’python’, 'jest’, 'bardzo’, 'popularnym’]
Zadanie 3:
Podany jest poniższy tekst:
text = „””JAVA – język programowania wysokiego poziomu
ogólnego przeznaczenia, o rozbudowanym pakiecie bibliotek
standardowych, którego ideą przewodnią jest czytelność i
klarowność kodu źródłowego.”””
Utwórz listę słów z podanego tekstu. Następnie dokonaj standaryzacji (zamień duże litery na małe, usuń znaki interpunkcyjne). Wydobądź tylko wyrazy z długością powyżej 10 znaków. Otrzymaną listę wydrukuj do konsoli:
Oczekiwany wynik:
’programowania’, 'przeznaczenia’, 'rozbudowanym’, 'standardowych’