Java:Sõne

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti

Sõne (ik string) on sümbolite kogum. Sõnest võib mõelda kui tähtede (või üldisemalt sümbolite) massiivist. Sõne on Java keeles objekt, mis tähendab, et tema kohta kehtivad natuke teised reeglid kui primitiivsete andmetüüpide kohta.

Sõne tüüpi muutuja loomine:

String s;

Muutuja loomisel võib sellele ka sisu anda:

String s = "tere";

Lisaks tekstilisele väärtusele võib väärtuseks olla ka null:

String s = null;

null tähendab objektide puhul seda, et antud objekt on väärtustamata. Kui me allpool vaatleme String'i meetodeid, siis kui meie vaadeldava objekti väärtus on null, siis ükski allpool toodud meetod ei tööta - käivitamisel antakse veateade.

Meetodid

length()

Tagastab sõne pikkuse (mitu sümbolit on sõnes).

System.out.println("tere".length()); // prindib "4"
System.out.println("".length()); // prindib "0"

charAt

Võimaldab sõnest leida ühe sümboli vastavalt ette antud indeksile. See töötab sarnaselt nagu massiivide puhul. Indeks hakkab 0-st, st esimese elemendi index on 0. Meetod tagastab andmetüübina char ehk ühe sümboli.

char c = "tere".charAt(0); // c = 't'
c = "tere".charAt(1); // c = 'e'

substring

Võimaldab sõnest alamosa võtta. Samanimelist meetodit on kaks: üks on ühe argumendiga, teine on kahe argumendiga.

Ühe argumendiga meetod tagastab alamsõne, mille algus on ette antud indeksiga positsioonist ning mille lõpp on algse sõne lõpp.

System.out.println("tere".substring(1)); // prindib "ere"
System.out.println("tere".substring(3)); // prindib "e"

Kahe argumendiga meetod tagastab alamsõne, mille algus on esimese argumendiga määratud indeksiga positsioonist ning mille lõpp on teise argumendiga määratud indeksiga positsioonist eelmine positsioon. Ehk siis alguse positsioon on kaasa arvatud, lõpu oma ei ole kaasa arvatud.

System.out.println("tere".substring(1,3)); // prindib "er"
System.out.println("tere".substring(3,4)); // prindib "e"

indexOf

Otsib sõnest etteantud (alam)sõne ja tagastab positsiooni, kust otsitav (alam)sõne leiti. Kui otsitavat (alam)sõne ei leita, tagastab -1.

System.out.println("tere".indexOf("t")); // prindib "0"
System.out.println("tere".indexOf("te")); // prindib "0"
System.out.println("tere".indexOf("re")); // prindib "2"
System.out.println("tere".indexOf("a")); // prindib "-1"

Kasutada on võimalik ka kahe argumendiga meetodit. Teine argument näitab ära, alates mis positsioonist otsima hakata.

System.out.println("tere".indexOf("t", 0)); // prindib "0"
System.out.println("tere".indexOf("t", 1)); // prindib "-1", kuna "t" ei leidu, kui hakata otsima alates positsioonist 1 (ehk siis teisest tähest)
System.out.println("tere".indexOf("e", 1)); // prindib "1"
System.out.println("tere".indexOf("e", 2)); // prindib "3", kui hakata positsioonist 2 otsima, leidub esimene "e" positsioonil 3

Sõnede võrlemine

Kui me näiteks int tüüpi muutuja väärtust saime kontrollida selliselt:

<source lang="java"> int x = 3; if (x == 3) {

   // do something

} </source>

siis sõnede puhul == võrdlus ei anna päris õiget tulemust. Kui te kasutate == võrdlust, annab see teile küll näiliselt õige tulemuse 90% juhtudest. Sisuliselt on sellel aga teine tähendus. Etteruttavalt olgu mainitud, et == võrdleb objektide puhul seda, kas nad on täpselt sama instants. Täpsemalt kirjeldatakse seda objektide juures.

Meid huvitab kontrollimisel see, kas sisu (ehk väärtus) on sama. Selleks kasutatakse meetodit equals:

<source lang="java"> if (s.equals("tere")) {

   // do something

} </source>

Sõne andmetüüp mälus

Sõne andmetüüpi muutuja hoiab lihtsustatult öeldes mäluaadressi, kus sõne väärtus paikneb. Ehk siis String s = "tere"; tähendab seda, et s hoiab näiteks väärtust 42 (positsioon mälus). Mälus sellel positsioonil paikneb sõne väärtus ja muu info. Mälus hoitakse lisaks "tere"-le veel näiteks sõne pikkust. Seega, näiteks s.length() ei loe sõne sümboleid kokku, vaid see info on juba mälus ja mingit arvutust ei toimu.

Iga sümbol sõnes kulutab 2 baiti mälu. Isegi, kui hoiate sõnes ASCII tabelisse kuuluvaid sümboleid, mille esitamiseks tegelikult piisab ühest baidist.

Vt. objektid mälus (TODO).

null väärtus

Objektide (ka sõne) puhul null on eriline "väärtus". Sisuliselt tähendab seda, et väärtus on määramata. Kui muidu objekti andmetüüp viitab lihtsustatul mäluaadressile, kus objekti sisu/väärtus salvestatud, siis null tähendab seda, et mälus pole selle objekti kohta (veel) andmeid.

null "väärtusega" objekti puhul ei saa ühtegi meetodit kasutada. Ehk siis määramata sõne puhul s.length(); annaks meile veateta "NullPointerException". Kuna s on null, siis meil objekti (sõne) ennast polegi. Seega, kõik pöördumised s poole annavad tulemuseks null'.

Kui kirjutada selline kontroll: <source lang="java"> if (s.equals("jah")) {

    // user entered "jah"?

} </source> Selline kontroll üldiselt toimib. Aga kui nüüd mingil põhjusel s on null, saab programm veateate. Ilus oleks eelnevalt kontrollida, kas s on väärtustatud: <source lang="java"> if (s == null) {

   // here s is null

} else {

   // here s is not null, we can use string methods
   System.out.println(s.length());

} </source>

Teine võimalus, kui meid huvitab, kas kaks sõne on võrdsed, võib kirjutada nii: <source lang="java"> if ("jah".equals(s)) {

   // checks if s value is "jah"

} </source>

"jah" on eelmise näite puhul samamoodi sõne ehk objekt. Kuna see objekt ei ole null, võib seda kasutada kontrollimise puhul esimesel kohal. Kui kaks sõne on sama sisuga, siis ei ole vahet, kumba kummaga kontrollime - mõlemal juhul peaks equals meetod tagastama true. Seega, selle näite puhul, isegi kui s on null, ei teki viga, kuna me ei proovi s muutuja kaudu mingeid meetodeid välja kutsuda.