Java programátor expert
Java String patrí medzi najpoužívanejšie dátové typy v celom jazyku Java. Stretneš sa s ním pri práci so súbormi, API komunikáciou, databázami, logovaním, spracovaním dát aj pri najjednoduchších úlohách. Ak sa chceš stať Java programátorom, musíš reťazce nielen používať, ale aj detailne rozumieť tomu, ako fungujú, čo dokážu a na čo si pri ich používaní treba dávať pozor.

V článku sa dozvieš:
Praktický tutoriál ťa prevedie všetkým, čo pri práci s Java String potrebuješ, od základov ako literály a porovnávanie reťazcov, až po praktické odporúčania na výkon a správne návyky. Nauč sa reťazce v Jave používať efektívne, bezpečne a bez najčastejších chýb.
String je v Jave špeciálna trieda. Nie je to primitívny typ ako int alebo double, hoci sa často správa veľmi prirodzene. V skutočnosti ide o immutable (nemeniteľný) objekt, ktorý má za sebou množstvo optimalizácií a špecifického správania v JVM.
Reťazce sa v aplikáciách vyskytujú vo veľkom množstve a používajú sa prakticky neustále. Nesprávna manipulácia s reťazcami môže výrazne zhoršiť výkon aplikácie. Porovnávanie reťazcov býva zdrojom častých chýb u začiatočníkov. Spracovanie textu je kritické pre webové aplikácie, API, spracovanie dát a bezpečnosť.
Ak rozumieš tomu, ako Java pracuje s reťazcami, dokážeš písať stabilnejší a efektívnejší kód.
K najjednoduchším programom vôbec patria programy v štýle „Hello World“. Ako by vyzeral taký v jazyku Java? To si teraz predvedieme. V tomto programe sa vypíše na obrazovku jednoduchý text z textového reťazca typu String (premenná message), v našom prípade veľkými písmenami. Výstup: AHOJ, JAVA!
public class Main {
public static void main(String[] args) {
String message = "Ahoj, Java!";
System.out.println(message.toUpperCase());
}
}
Jednoduché? Určite. Ale za tým jedným riadkom sa skrýva veľa mechanizmov, ktoré spolu postupne preskúmame.
V tejto kapitole si vysvetlíme základnú filozofiu okolo Java String reťazcov. Ak pochopíš, čo je String, prečo je immutable a ako funguje String Pool, tvoja práca s reťazcami bude nielen rýchlejšia, ale aj bezpečnejšia a predvídateľnejšia.
Poďme si to vysvetliť jednoducho, čitateľne a s praktickými ukážkami.
Najčastejšie vytvoríš reťazec jednoducho takto:
String name = "Java";
Toto je reťazcový literál – text zapísaný medzi úvodzovkami.
Je to najefektívnejší a najpoužívanejší spôsob vytvárania reťazcov v Jave.
Niektoré špeciálne znaky (napr. lomítko alebo úvodzovky) musíš zapísať so spätným lomítkom (pretože bez neho majú v jazyku iný význam):
String path = "C:\\Users\\Jozef";
String quote = "Java je \"super\" jazyk.";
Medzi bežné escape sekvencie patria napr.:
Ak napíšeš
String text = new String("Java");
vytvoríš dva objekty: literál „Java“ a nový objekt String s rovnakým obsahom. Toto je zbytočné a pomalšie. Preto sa tomuto spôsobu v Java praxi vyhýbaj, okrem veľmi špecifických prípadov.
Nepoužívaj vytváranie reťazcov cez new, namiesto toho používaj literál. Ekvivalentný príklad vyzerá nasledovne: String text = „Java“;
Od verzie Java 13 máš k dispozícii funkcionalitu: textové bloky. Ak potrebuješ zapísať viacriadkový text, môžeš ho pomocou textových blokov zapísať v Jave napr. takto:
String html = """
<html>
<body>
<h1>Ahoj, Java!</h1>
</body>
</html>
""";
Výhody sú na prvý pohľad zrejmé. Použitím jednoduchého zápisu si zachováme formátovanie textu, pričom nemusíme žiadne znaky escapovať. Výborne sa hodí pre notácie JSON, XML, HTML, SQL.
Kľúčová vlastnosť reťazcov v Jave je immutabilita. Táto vlastnosť znamená: String raz vytvorený už nikdy nezmeníš. Keď voláš metódu, ktorá mení reťazec, Java vytvorí v skutočnosti nový objekt:
String name = "Java";
String upper = name.toUpperCase();
System.out.println(name); // Java
System.out.println(upper); // JAVA
Premenná name ostáva nezmenená. Metóda toUpperCase() vracia nový String.
Existuje mnoho dôvodov, prečo bol dátový typ String navrhnutý ako immutable. Medzi najdôležitejšie dôvody patria: bezpečnosť, multithreading (thread-safety) a String Pool.
Reťazce sa používajú v názvoch súborov, sieťových protokoloch, databázových spojeniach, načítavaní a inicializácii tried (class-loading). Je dôležité, aby sa nemohli meniť počas behu aplikácie.
Keďže sa String nemení, viaceré súbežne bežiace vlákna ho môžu čítať naraz (bez synchronizácie).
String Pool môže existovať iba vďaka immutabilite. Ak by sa string mohol meniť, zdieľanie jedného objektu medzi viacerými premennými by nebolo možné a bolo by nebezpečné.
Každá operácia, ktorá mení String, vytvorí nový objekt:
String a = "A";
a = a + "B"; // vzniká nový objekt!
V cykloch to môže byť extrémne neefektívne. Z toho dôvodu existuje StringBuilder, ktorého sa dotkneme neskôr.
String Pool je špeciálna oblasť pamäte, kde Java ukladá unikátne string literály.
V tomto príklade obidve premenné ukazujú na ten istý objekt v poole.
String a = "Java";
String b = "Java";
System.out.println(a == b); // true
Pre porovnanie, ak by sme rovnaké reťazce vytvárali pomocou new:
String a = new String("Java");
String b = new String("Java");
System.out.println(a == b); // false
Reťazce (napriek rovnakému textu) nie sú rovnaké, pretože tu vznikli dva samostatné objekty.
Metóda intern() vezme reťazec a vloží ho do String Poolu (ak tam ešte nie je).
String x = new String("Hello");
String y = x.intern();
String z = "Hello";
System.out.println(y == z); // true
V praxi sa metóda intern() používa najmä: v parseroch, veľkých systémových frameworkoch a aplikáciách, kde sa opakuje obrovské množstvo rovnakých textov.
Zapamätaj si, že:
Osvojením si týchto operácií s Java String zvládneš vyriešiť väčšinu problémov spojených s textom, od validácie textových vstupov cez parsovanie dát až po tvorbu skriptov či naprogramovanie vlastného parsera.
Základom práce s reťazcami je zistiť ich dĺžku a pristupovať k jednotlivým znakom na konkrétnych pozíciách.
Slúži na zistenie dĺžky reťazca. Patrí medzi najjednoduchšie operácie so String.
String text = "Java";
System.out.println(text.length()); // 4
Pozor: length() pre String je metóda, pri poliach je to atribút (array.length).
Predstavuje získanie znaku na pozícii. Indexovanie začína od nuly.
String text = "Java";
char c = text.charAt(2);
System.out.println(c); // 'v'
Najčastejšia chyba pri indexovaní posledného znaku reťazca vyzerá nasledovne:
text.charAt(text.length()); // vyvolá StringIndexOutOfBoundsException
Posledný znak reťazca má vždy index length() – 1.
Správne porovnávanie reťazcov v Jave je jednou z najčastejších tém pre začiatočníkov. Operátor == neporovnáva obsah reťazcov, ale ich referencie (miesta v pamäti).
Začiatočníci v Jave často nesprávne porovnávajú dva reťazce:
String a = "Java";
String b = "Java";
System.out.println(a == b); // true (ale náhodou!)
Toto funguje len kvôli String Poolu. V ňom existuje iba jeden literál, preto sa porovnáva referencia toho istého objektu String, čo prirodzene vráti true.
Pri objektoch vytvorených cez new, to ale neplatí:
String x = new String("Java");
String y = new String("Java");
System.out.println(x == y); // false
A to preto, lebo operátor == porovnáva referencie a nie obsah reťazcov.
Java String equals() slúži na porovnávanie obsahu reťazcov. V nasledovnom príklade majú oba reťazce zhodný obsah.
String a = "Java";
String b = "Java";
System.out.println(a.equals(b)); // true
Táto metóda je vhodná na porovnávanie reťazcov, ak ti nezáleží na veľkosti písmen.
“java”.equalsIgnoreCase(“JAVA”);//true
Existuje viacero metód na spájanie reťazcov.
Operátor + je jednoduchý, ale môže byť neefektívny. V tomto príklade sa tento zápis preloží na úrovni kompilátora na StringBuilder.
String s = “Hello” + “world!”;
"java".equalsIgnoreCase("JAVA"); // true
Ale pozor, V cykloch je operácia + s reťazcami veľmi neefektívna:
String result = "";
for (int i = 0; i < 1000; i++) {
result += i; // vzniknú až stovky nových objektov!
}
Rýchla, ale nepraktická metóda na spájanie reťazcov. Problém tejto metódy je, že nevie pracovať s null a vyhodí výnimku. Preto sa v praxi príliš nepoužíva. V nasledovnom príklade je použitie OK.
String s = "Hello".concat(" world");
Tento spôsob používaj pri spájaní veľkého množstva textu. Ponúka najlepší výkon a nevytvára žiadne zbytočné objekty. Rovnako sa hodí aj do cyklov.
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i).append(", ");
}
String result = sb.toString();
Metódy na vyhľadávanie textu v reťazci sa ti zídu napríklad pri overovaní vstupov, filtrovaní dát alebo parsovaní súborov.
Zistí, či sa daný literál nachádza v reťazci. Dôležité je vedieť, že táto metóda rozlišuje veľkosť písmen.
"hello world".contains("world"); // true
"hello world".contains("World"); // false
Vracia pozíciu prvého výskytu podreťazca. Ak nič nenájde, návratová hodnota je -1.
"banana".indexOf("na"); // 2
Zistí, či reťazec začína daným literálom.
"Hello.java".startsWith("Hello"); // true
Zistí, či reťazec končí daným literálom.
"Hello.java".endsWith(".java"); // true
Posledné dve metódy sú veľmi užitočné pri filtrovaní súborov či URL adries. Kompletný prehľad všetkých metód triedy String nájdeš v oficiálnej dokumentácii Java String API (JDK 25).
Ak by sme chceli zistiť, či reťazec obsahuje iba písmená, vedeli by sme si na tento účel napísať takúto metódu:
public static boolean isAlphabetic(String s) {
for (char c : s.toCharArray()) {
if (!Character.isLetter(c))
return false;
}
return true;
}
V praxi treba často pracovať len s časťou reťazca. Presne na to slúžia metódy Java substring() a Java split().
Ide o extrahovanie textu medzi indexami begin a end. Pozor, znak na indexe end sa do výsledku nezahrnie.
String text = "Hello Java";
String s1 = text.substring(6); // "Java"
String s2 = text.substring(0, 5); // "Hello"
Znamená rozdelenie textu na časti oddeľovačom. Metóda split() využíva regulárny výraz (regex), takže niektoré znaky treba escapovať (napr. `.` alebo `|`).
String line = "Peter;25;Developer";
String[] parts = line.split(";");
System.out.println(parts[0]); // Peter
System.out.println(parts[1]); // 25
System.out.println(parts[2]); // Developer
Java ponúka viacero metód na nahrádzanie textu v reťazci.
Nahradenie daného textu v reťazci novým na všetkých pozíciách.
"1-2-3-4".replace("-", ":"); // 1:2:3:4
Nahradenie daného textu v reťazci novým, nahradí len prvý výskyt.
String text = "Mačka spí. Mačka je unavená.";
String result = text.replaceFirst("Mačka", "Pes");
System.out.println(result); // Výstup: Pes spí. Mačka je unavená.
Pri spracovaní vstupov je často potrebné odstrániť prebytočné biele znaky z reťazca. Java má na to dve metódy.
Medzi biele znaky, ktoré odstráni patria medzery, tabulátory, prechody na nové riadky, resp. znaky s Unicode kódom (<= U+0020).
Metóda strip(), dostupná od verzie Java 11, odstraňuje všetky Unicode whitespace znaky, ktoré sú definované metódou Character.isWhitespace(). Táto metóda oproti trim() je modernejšia, presnejšia a mala by byť preferovaná v nových projektoch.
Nasledujúci príklad ilustruje viacero techník naraz, ktoré sme si práve predstavili. Potrebujeme vyextrahovať informácie zo zadaného reťazca.
String input = " Peter; 25;Developer ";
// Očistenie vstupu o biele znaky
input = input.strip();
// Rozdelenie
String[] parts = input.split(";");
// Vyčistenie medzier
String name = parts[0].strip();
int age = Integer.parseInt(parts[1].strip());
String job = parts[2].strip();
// Vyskladanie výstupu
StringBuilder sb = new StringBuilder();
sb.append("Meno: ").append(name).append("\n");
sb.append("Vek: ").append(age).append("\n");
sb.append("Pozícia: ").append(job);
System.out.println(sb.toString());
Výstup:
Meno: Peter
Vek: 25
Pozícia: Developer
Zapamätaj si, že:
V tejto kapitole sa pozrieme na praktické techniky na formátovanie Java String (výstupy, logy, reporty) a na konverziu medzi String a základnými typmi alebo kolekciami.
Metóda String.format (a príbuzné System.out.printf(), trieda Formatter) sú najjednoduchší spôsob, ako vytvoriť čitateľné reťazce s číslami, zarovnaním a presnosťou.
String name = "Peter";
int age = 32;
String s = String.format("Meno: %s, Vek: %d", name, age);
System.out.println(s); // Meno: Peter, Vek: 32
V metóde format() vieme upraviť aj šírku a presnosť (konvertovaného čísla) na reťazec. Napr. %8.2f znamená: celková šírka 8 znakov, 2 desatinné miesta.
double pi = Math.PI;
System.out.println(String.format("Pi: %.2f", pi));
System.out.println(String.format("Číslo: %8.2f", 123.456));
Výstup:
Pi: 3,14
Číslo: 123,46
Ak potrebuješ formátovanie čísla podľa špecifického regiónu, použi Locale. Výraz %,.2f pridá separátor tisícov.
import java.util.Locale;
double value = 12345.67;
String us = String.format(Locale.US, "%,.2f", value); // 12,345.67
String de = String.format(Locale.GERMANY, "%,.2f", value); // 12.345,67
Konverzie sú bežné pri parsovaní CSV súborov, čítaní parametrov z URL alebo validácii vstupov.
Každá trieda pre daný dátový typ čísla obsahuje príslušnú triedu na konverziu String na daný číselný typ. Ak reťazec nie je platné číslo, metódy vyhodia NumberFormatException, preto je potrebné parsovať reťazce na čísla v try-catch bloku.
try {
int i = Integer.parseInt("123");
long l = Long.parseLong("10000000000");
double d = Double.parseDouble("3.1415");
} catch (NumberFormatException e) {
// TODO: ošetriť chybný vstup
}
Pre matematické operácie s peniazmi nepoužívaj dátový typ double, môžeš naraziť na problémy so zaokrúhľovaním a presnosťou. Java pre tieto operácie ponúka dátový typ BigDecimal. Ten vieme vytvoriť priamo so String konštruktorom:
import java.math.BigDecimal;
BigDecimal bd = new BigDecimal("12.34");
Pri formátoch (špecifických pre daný región napr. DE), ako 1.234,56 použi NumberFormat:
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
try {
Number num = nf.parse("1.234,56"); // môže hodiť ParseException
} catch (ParseException e) {
// TODO: ošetriť chybný vstup
}
Pri prevode čísel do reťazca máš v Jave viac možností. Líšia sa najmä tým, ako pracujú s null, či sú rýchle alebo podporujú formátovanie. Pozrime sa na najčastejšie používané metódy.
Univerzálny, bezpečný spôsob prevodu. Funguje pre všetky typy (int, long, double, objekty…). Nespôsobí výnimku pri null, namiesto toho vráti reťazec „null“.
Integer num = null;
String s1 = String.valueOf(num); // "null"
double d = 3.14;
String s2 = String.valueOf(d); // "3.14"
Metódy toString() pre rôzne číselne typy (napr. Integer.toString(i), Long.toString(l), …) ponúkajú rýchly a priamočiary spôsob pri práci s primitívnymi typmi. Tieto metódy neprijímajú null, pretože pracujú s primitívnymi typmi.
int age = 32;
String s = Integer.toString(age); // "32"
Metódu String.format() sme si už predstavili. Hodí sa, ak potrebuješ presné formátovanie, zarovnanie, počet desatinných miest alebo lokalizáciu. Tento spôsob je o niečo pomalší, ale veľmi čitateľný a flexibilný.
Často potrebuješ previesť údaje medzi String a kolekciami, napr. robíš iterovanie, parsovanie alebo vytváraš CSV.
Takto prevedieš String do char[]. Pole má tú výhodu, že okrem rýchleho prístupu, môžeš do poľa aj priamo zapisovať.
String word = "Java";
char[] chars = word.toCharArray();
Takto prevedieš char[] do String.
char[] arr = {'J', 'a', 'v', 'a'};
String s = new String(arr);
Metódu split() sme už spomínali. Výborne sa hodí, ak potrebujeme rozbiť reťazec do menších reťazcov podľa oddeľovača.
String line = "a,b,c";
String[] parts = line.split(","); // ["a", "b", "c"]
Pre spojenie List<String> do jedného reťazca môžeme využiť metódu join():
import java.util.List;
List<String> names = List.of("Jano", "Miro", "Zuzka");
String csv = String.join(",", names); // "Jano,Miro,Zuzka"
Ak zoznam obsahuje null hodnotu, metóda String.join() vyhodí NullPointerException, preto odstráň, alebo naplň null hodnoty pred volaním.
Zapamätaj si, že:
Táto tabuľka poskytuje rýchly prehľad najpoužívanejších Java String metód s krátkym popisom.
| Metóda | Popis |
|---|---|
| substring() | Vráti časť reťazca podľa zadaných indexov. |
| charAt() | Vráti znak na určenej pozícii. |
| contains() | Skontroluje, či reťazec obsahuje podreťazec. |
| indexOf() | Vráti pozíciu zadaného znaku alebo podreťazca. |
| trim() | Odstráni medzery na začiatku a konci reťazca. |
| toLowerCase() | Prevedie všetky znaky reťazca na malé písmená. |
| toUpperCase() | Prevedie všetky znaky reťazca na veľké písmená. |
| isEmpty() | Skontroluje, či je reťazec prázdny. |
| split() | Rozdelí reťazec na pole podľa zadaného separátora. |
| replace() | Nahradí starý znak alebo podreťazec novým. |
| replaceFirst() | Nahradí prvý výskyt podreťazca. |
| replaceAll() | Nahradí všetky podreťazce zhodujúce sa s regexom. |
| startsWith() | Skontroluje, či reťazec začína zadaným textom. |
| endsWith() | Skontroluje, či reťazec končí zadaným textom. |
| join() | Spojí viacero reťazcov s použitím separátora. |
| format() | Vytvorí naformátovaný reťazec podľa špecifikácie. |
| valueOf() | Vráti reťazcovú reprezentáciu zadaného objektu alebo primitívu. |
| toCharArray() | Prevedie reťazec na pole znakov. |
| subSequence() | Vráti podsekvenciu reťazca (CharSequence). |
| compareTo() | Porovná dva reťazce podľa slovníkového poradia. |
| compareToIgnoreCase() | Porovná dva reťazce ignorujúc veľkosť písmen. |
| matches() | Skontroluje, či reťazec zodpovedá regex vzoru. |
| getBytes() | Prevedie reťazec na pole bajtov. |
| contentEquals() | Skontroluje, či je reťazec rovnaký ako zadané CharSequence. |
| hashCode() | Vráti hash kód reťazca. |
| intern() | Vráti kanonickú reprezentáciu reťazca (String pool). |
Java String je jedným z najdôležitejších dátových typov, s ktorým sa ako Java developer stretneš prakticky denne. Práca s reťazcami sa neustále vyvíja a s každou novou verziou JDK pribúdajú metódy, ktoré zjednodušujú bežné operácie. Príkladom sú textové bloky z Java 13 alebo metóda strip() z Java 11. Sledovať tieto zmeny sa oplatí, pretože ti ušetria riadky kódu aj zbytočné chyby.
Zdroj:
https://docs.oracle.com/en/java/javase/25/docs/api//java.base/java/lang/String.html
Súvisiace články