1 Základy programovacieho jazyka Java Ing. Peter Kačur, September 2021 - December 2022, verzia dokumentu 47 (Tento dokument je možné voľne šíriť iba za podmienky zachovania jeho pôvodného obsahu v ucelenej nefragmentovanej forme na nekomerčné účely) 192 Reťazcová konštanta(Literal) Objekt typu String je na rozdiel od StringBuffer či StringBuilder nemeniteľný, teda ak dôjde k jeho zmene, vytvorí sa nová inštancia. String objekt vytvárame buď pomocou úvodzoviek ako reťazcovú konštantu alebo pomocou operátora new. Reťazcová konštanta: String s="Ahoj"; Vždy keď sa vytvorí reťazcová konštanta, JVM skontroluje Oblasť reťazcových konštánt či sa v nej už takáto konštanta neneachádza. Ak áno potom sa vytvorí referencia na ňu a ak nie tak sa vytvorí nová v tejto oblasti. 1. String s1="Ahoj"; 2. String s2="Ahoj"; //nevytvorí sa nová inštancia iba referencia na už existujúci reťazec Výhoda tohto prístupu je efektívne nakladanie s pamäťou, bezpečnosť či už vo viac vlákonovom prístupe alebo pred záškodníkmi a iné. Obr. 26 : Heap1 193 Objekt String pomocou new 1.public class StringPriklad{ 2.public static void main(String args[]){ Na vytvorenie objektu typu String sa 3.String s1="ahoj"; //literal 4.char ch[]={'r','e','t','a','z','e','c'}; použije normálna hromada mimo 5.String s2=new String(ch); //konvertovanie oblasti hromady konštánt, avšak char poľa na string samotná konštanta "Ahoj" sa 6.String s3=new String("priklad"); umiestní do hromady konštánt. //vytvorenie stringu ako objektu Referenčná premnná odkazuje na 7.System.out.println(s1); objekt v normálnej hromade. 8.System.out.println(s2); String s=new String("Ahoj"); //vytvoria 9.System.out.println(s3); sa dva objekty a jedna referenčná 10.}} premenná Výstup: ahoj retazec priklad 194 *Nemeniteľnosť reťazca (Immutable String) String sa zvyčajne používa na ukladanie prihlasovacích údajov ako meno a heslo a vďaka nemeniteľsnoti sú tieto String objekty ochránené pred nepovolenou zmenou. 1. String s="Červena"; 2. s.concat(" Zelená"); //concat() metóda pridá string na koniec 3. System.out.println(s); //vypíše iba červená bez zelenej Na obrázku je ilustrované čo sa udeje v pamäti. Pre spojenie treba urobiť úpravu: 1. s=s.concat(" Zelená"); //explicitné priradenie do referenčnej premen. 2. System.out.println(s); //vypíše Červená Zelená Obr. 29 : Nemeniteľnosť 195 Porovnávanie reťazcov (Comparison) Reťazce je možné porovnávať vzhľadom na obsah alebo referenciu podľa účelu: overenie obsahu: metóda equals() - porovná hodnoty dvoch objektov a vráti ture alebo false lexikografické porovnanie(abecedne usporiadaná množina znakov kde sa dá povedať, ktorý znak je väčší a ktorý menší na základe poradia v abecede, ale aj dĺžky celého reťazca): metóda compareTo() - porovná dva objekty a zistí, ktorý je väčší a ktorý je menší porovnávanie referencií: operátor == 196 Porovnávanie reťazcov – equals() Metóda equals() slúži na porovnanie hodnôt reťazcov. public boolean equals(Object o) public boolean equalsIgnoreCase(String s) – ignoruje veľkosti písmen 1. 2. class TeststPorovnavanie1{ public static void main(String args[]){ 1. class TeststPorovnavanie2{ 3. String f1="Biela"; 2. 4. String f2="Biela"; 3. String f1="Biela"; 5. String f3=new String("Biela"); 4. String f2="BIELA"; 6. String f4="Modra"; 5. System.out.println(f1.equals(f2)); //false 7. System.out.println(f1.equals(f2)); //true 6. 8. System.out.println(f1.equals(f3)); //true System.out.println(f1.equalsIgnoreCase(f2)); //true 9. System.out.println(f1.equals(f4)); //false 10. } 11. } 7. 8. 9. public static void main(String args[]){ } } 197 Porovnávanie reťazcov – operátor == Operátor == porovnáva referencie a nie hodnoty. 1. class TeststPorovnavanie3{ 2. public static void main(String args[]){ 3. String f1="Modra"; 4. String f2="Modra"; 5. String f3=new String("Modra"); 6. System.out.println(f1==f2);//true lebo obidva odkazujú na rovnaký objekt 7. System.out.println(f1==f3); //false lebo f3 odkazuje na inštanciu vytvorenú mimo oblasti konštantných reťazcov 8. } 9. } 198 Porovnávanie reťazcov – compareTo() Metóda compareTo() porovnáva reťazcové hodnoty lexikograficky (abecedne) a vracia celé číslo: f1 == f2 : vráti 0 f1>f2 : vráti kladné číslo f1 < f2 : vráti záporné číslo 1. class TeststPorovnavanie4{ 2. public static void main(String args[]){ 3. String f1="Modra"; 4. String f2="Modra"; 5. String f3="Fialova"; //F má menšiu hodnotu (70) v ASCII ako M (77) 6. System.out.println(f1.compareTo(f2));//0 lebo f1==f2 7. System.out.println(f1.compareTo(f3));//7 lebo f1>f3 8. System.out.println(f3.compareTo(f1));//-7 lebo f3<f1 9. 10. } } 199 Spájanie reťazcov (Concatenation) Spájanie reťazcov zabezpečuje spojenie viacerých reťazcov do jedného. Sú dve cesty spájania: operátorom + Operácia je realizovaná pomocou triedy StringBuilder alebo StringBuffea a jej metódy append() metódou concat() Spájanie reťazcov – operátor + 200 1. class TestStringSpajanie1{ 2. public static void main(String arg 1. class TestStringSpajanie2{ s[]){ 2. public static void main(String arg 3. String auto="Biele"+" auto"; s[]){ 4. System.out.println(auto); //Biele auto 5. } 3. String s=10+20+"Biele"+30+40; 4. System.out.println(s);//30Biele3 040 6. } 5. } /* 6. } Java compiler vykoná v pozadí nasledovné: String auto=(new StringBuilder()).append(" Biele").append(" auto).toString(); */ 201 Spájanie reťazcov – metóda concat() 1. class TestStringSpajanie3{ 2. public static void main(String args[]){ 3. String farba="Biely "; 4. String typ="Volkswagen"; 5. String auto=farba.concat(typ); 6. System.out.println(auto);//Biely Volkswagen 7. 8. } } 202 Iné spôsoby spájania reťazcov 1 Na spájanie je možné použiť: Metóda append() z triedy StringBuilder 1. StringBuilder s1 = new StringBuilder("Biele"); 2. StringBuilder s2 = new StringBuilder(" BMW"); 3. StringBuilder s = s1.append(s2); 4. System.out.println(s.toString()); *Metóda String.format() 1. String s1 = new String("Červeny"); 2. String s2 = new String(" Citroen"); 3. String s = String.format("%s%s",s1,s2); 4. System.out.println(s.toString()); 205 Podreťazec (Substring) Podreťazec je výber sekvencie znakov z pôvodného reťazca. Pre operáciu výberu podreťazca sa používa vstavaná metóda substring() z triedy String: public String substring(int startIndex) startIndex – počitočný index podreťazca, vrátane, teda je inclusive metóda vyhadzuje výnimku IndexOutOfBoundException ak je startIndex väčší ako dĺžka pôvodného reťazca alebo je menší ako nula public String substring(int startIndex, int endlIndex) endlIndex – je koncový index podreťazca, je exclusive metóda vyhadzuje výnimku IndexOutOfBoundException ak je startIndex menší ako nula alebo väčší ako endlIndex alebo endlIndex je väčší ako pôvodný reťazec 206 Metóda substring() Príklad 1. - Inclusive a exclusive: 1. String s="ahoj"; 2. System.out.println(s.substring(0,2)); //vráti ah substring a nie aho Príklad 2.: 1. public class TestPodretazec{ 2. public static void main(String args[]){ 3. String s="BielaKia"; 4. System.out.println("Pôvodný reťazec: " + s); 5. System.out.println("Podreťazec začínajúci na indexe 5: " +s.substring(5));//Kia 6. System.out.println("Podreťazec začínajúci od indexu 0 do 5: "+s.substring(0,5)); //Biela 7. } 8. } 207 Ďalšie užitočné metódy triedy String 1. Zmena veľkosti písmen pomocou toUpperCase() a toLowerCase() 1. String s="Peter"; 2. System.out.println(s.toUpperCase()); //PETER 3. System.out.println(s.toLowerCase()); //peter Odstránenie bielých znakov pred a za reťazcom pomocou trim() 1. String s=" Peter "; 2. System.out.println(s.trim()); //Peter Kontrola či reťazec začína alebo končí na dané písmeno či reťazec pomocou startsWith() alebo endsWith() 1. String s="Peter"; 2. System.out.println(s.startsWith("Pe")); //true 3. System.out.println(s.endsWith("r")); //true 208 Ďalšie užitočné metódy triedy String 2. Zistenie či je znak na špecifickom indexe pomocou metódy charAt(): 1. String s="Peter"; 2. System.out.println(s.charAt(0)); //P 3. System.out.println(s.charAt(3)); //e Zistenie dĺžky reťazca pomocou metódy length() 1. String s="Peter"; 2. System.out.println(s.length()); //5 3. ystem.out.println(s.length()); //5 Konvertvovanie daného typu ako int, long, float, double, boolean, char a char array do String pomocou metódy valueOf(): 1. int a=12; 2. String s=String.valueOf(a); 3. System.out.println(s+34); //1234 209 Ďalšie užitočné metódy triedy String 3. Nahradenie všetkých výskytov prvej sekvencie znakov za druhú sekvenciu znakov pomocou metódy replace() : 1. String s1="Java je programovací jazyk. Java je platforma. Java je ostrov."; 2. String replaceString=s1.replace("Java","Káva"); //Nahradí všetky výskyty "Java" za "Káva" 3. System.out.println(replaceString); //Káva je programovací jazyk. Káva je platforma. Káva je ostrov.