<< Referencie a konštruktory | Obsah | Myšacie udalosti v JPAZe >>
char
(znak)Posledný primitívny (jednoduchý) typ, ktorý sme nespomínali, je typ char
. Typ char
predstavuje jeden znak. Znakové literály (konkrétne znakové hodnoty) píšeme tak, že znak uzavrieme do apostrofov:
Java, narozdiel od iných programovacích jazykov/platforiem (C, C++, Pascal, Delphi, PHP, ...), uchováva znaky v originálnej verzii kódovania UNICODE, t.j. v premennej typu char
môže byť jeden z 65536 znakov tohto kódovania. Vďaka tomu v Jave nemáme problém s národnými znakmi (slovenčina, ruština, švédčina, ázijské znaky, ...).
Niektoré znaky majú svoj historický význam, iné znaky naopak musíme zapisovať špeciálnym spôsobom. Java má niekoľko špeciálnych znakov, z ktorých najdôležitejšie sú:
' '
'\t'
'\n'
'\\'
'\"'
'\''
(Pre pokročilých.) Za kódovaniami sa skrýva dlhá historia. Pod kódovaním si môžeme predstaviť veľkú tabuľku, ktorá hovorí, aké písmeno reprezentuje i
-ty znak kódovania:
Znaky môžeme tak, ako všetky jednoduché hodnoty navzájom porovnávať. V prípade znakov je toto porovnanie porovnaním toho, či sa daný znak nachádza v UNICODE tabuľke skôr. Keďže ASCII je na začiatku každého kódovania, veľmi užitočná vlastnosť je to, že cifry, malé písmená a aj veľké písmená anglickej abecedy idú pekne za sebou.
Častý je test na overenie toho, či v znakovej premennej je znak cifry:
Podobne môžeme testovať znaky anglickej abecedy ...
Premenné typu char
nám dovoľujú uchovať jeden znak. S týmto si ale pri praktických problémoch veľmi nepomôžeme. Zvyčajne totiž potrebujeme uchovať postupnosť znakov. Na uchovanie postupnosti znakov slúžia objekty triedy String
. Objekt triedy String
uchovávajúci nejakú postupnosť znakov vytvoríme takto:
Všimnime si, že ako parameter konštruktora uvádzame reťazcový literál (konkrétnu postupnosť znakov). Reťazcové literály vždy píšeme medzi úvodzovky. Ak v reťazcovom literály chceme použiť niektorý zo špeciálnych znakov, zapíšeme ho v takej forme, ako to je uvedené vyššie (apostrofy samozrejme vynecháme).
Keďže reťazce sú uložené v objektoch, platia pre ne všetky "objektové" pravidlá. Dôležité je si uvedomiť, že vo vyššie uvedenom príklade premenná s
neobsahuje samotný reťazec, ale iba referencuje objekt triedy String
, ktorý túto postupnosť znakov uchováva.
Tak ako všetky objekty, aj objekty triedy String
majú zaujímavé metódy:
int length()
- vráti dĺžku reťazca (počet znakov)
char charAt(int index)
- vráti znak na zadanom indexe. Indexom nazývame pozíciu v reťazci. Jednotlivé znaky sú indexované od 0, t.j. prvý znak reťazca je na indexe 0, posledný znak na indexe length()-1
.
String concat(String s)
- vráti referenciu na novovytvorený objekt triedy String
, ktorého obsah vznikol spojením (zreťazením) postupnosti znakov tohto objektu a znakov objektu triedy String
referencovaného z parametra s
.
Pri rôznych metódach pracujúcich so znakmi potrebujeme postupne spracovať jednotlivé znaky reťazca. Ukážme si to na príklade metódy, ktorá spočíta počet výskytov znaku 'a' v zadanom reťazci:
Opäť pripomíname, že parameter s
neobsahuje samotný reťazec, ale len referencuje objekt triedy String
, ktorý máme "preskúmať".
Pri riešení úloh potrebujeme často zistiť, či postupnosti znakov v 2 (rôznych) objektoch triedy String
sú rôzne, alebo rovnake. Na tento účel vieme použiť metódu equals
.
Veľmi častou chybou pri práci s reťazcami býva, že rovnosť reťazcov sa testuje pomocou operácie rovnosti:
My však už vieme, že tento postup je zlý práve preto, že premenné s
a r
sú premenné referenčného typu. Vyššie uvedený test len testuje, či premenné r
a s
referencujú ten istý objekt a nie to, či obsah (postupnosť znakov) je rovnaký.
Trieda String
patrí medzi triedy, ktoré majú v Jave špeciálnu podporu, t.j. sú dovolené isté skrátené konštrukcie:
Operátor +
funguje ako operátor zreťazenia, ak jeden z jeho operandov je reťazec (referencia na objekt triedy String
). Dokonca, ak druhý z operandov nie je reťazec, Java sa túto hodnotu pokúsi prerobiť na reťazec, ktorý bude použitý pri "zreťazovaní".
Môžeme tak písať aj takéto príkazy:
Pozrime sa, ako by vyzerala metóda, ktorá vráti referenciu na novovytvorený reťazec (objekt triedy String
), ktorý obsahuje znaky zadaného reťazca v opačnom poradí. Pri riešení postupne vyberáme znaky reťazce referencovaného parametrom s
zľava doprava. V každom kroku vytvárame nový reťazec, ktorý vznikne zreťazením aktuálneho znaku a doposiaľ vytvorenej obrátenej postupnosti.
Zoznam metód objektov triedy String
možno nájsť na stránke: http://java.sun.com/javase/6/docs/api/java/lang/String.html#method_summary
Predchádzajúce metódy "vytvárania" nových reťazcov majú jednu podstatnú nevýhodu: pri ich vykonávaní vznikne veľa "odpadu" vo forme dočasných reťazcov (objektov triedy String
). Toto je prirodzené, keďže objekty triedy String
majú tú vlastnosť, že ich obsah (uchovávanú postupnosť znakov) po vytvorení nejde už zmeniť. Aby sme sa vyhli zbytočnému vytváraniu dočasných reťazcov, môžeme pri budovaní obsahu objektov triedy String
použiť objekty triedy StringBuilder
.
Poslaním objektov triedy StringBuilder
je podobne ako v prípade objektov triedy String
uchovávať postupnosť znakov. Narozdiel od nich však objekty triedy StringBuilder
dovoľujú meniť svoj obsah. Najčastejšie používané metódy objektov triedy StringBuilder
sú:
append
- pridá nejakú postupnosť znakov na koniec uchovávaného reťazca (pozor, metóda append
mení obsah objektu, narozdiel od metódy concat
objektov triedy String
, ktorá vytvorí nový objekt triedy String
)
toString
- vráti referenciu na novovytvorený objekt triedy String
, ktorého obsah bude rovnaký ako je aktuálny obsah objektu triedy StringBuilder
.
Príklad:
<< Referencie a konštruktory | Obsah | Myšacie udalosti v JPAZe >>