Java kalboje Stygos
klasė sujungia masyvą char
. Paprasčiau tariant, Stygos
yra simbolių masyvas, naudojamas žodžiams, sakiniams ar kitiems pageidaujamiems duomenims kurti.
Kapsuliavimas yra viena iš galingiausių objektinio programavimo sąvokų. Dėl inkapsuliacijos jums nereikia žinoti kaip dirba styginių klasė; tereikia žinoti ką metodus, kuriuos reikia naudoti jo sąsajoje.
Kai pažvelgsite į Stygos
klasės Java, galite pamatyti, kaip masyvas char
yra kapsulėje:
public String (char value []) {this (reikšmė, 0, reikšmė.ilgis, nulis); }
Norėdami geriau suprasti kapsulę, apsvarstykite fizinį objektą: automobilį. Ar norite žinoti, kaip automobilis veikia po variklio dangčiu, kad juo važiuotumėte? Žinoma, ne, bet jūs turite žinoti, ką daro automobilio sąsajos: tokie dalykai kaip akseleratorius, stabdžiai ir vairas. Kiekviena iš šių sąsajų palaiko tam tikrus veiksmus: pagreitinkite, stabdykite, pasukite į kairę, pasukite į dešinę. Lygiai taip pat ir programuojant į objektą.
Mano pirmasis tinklaraštis „Java Challengers“ serija pristatė perkrovos metodą, kuris yra Stygos
klasė naudoja daug. Perkrovimas gali padaryti jūsų klases tikrai lanksčias, įskaitant Stygos
:
public String (String original) {} public String (char value [], int offset, int count) {} public String (int [] codePoints, int offset, int count) {} viešoji eilutė (baitų baitai [], int offset , int ilgis, String charsetName) {} // Ir taip toliau ... ...
Užuot bandęs suprasti, kaip Stygos
klasės darbus, šis „Java Challenger“ padės jums suprasti ką tai daro ir kaip naudoti jį savo kode.
Kas yra „String“ baseinas?
Stygos
yra galbūt labiausiai naudojama „Java“ klasė. Jei kaskart atminties kaupe buvo sukurtas naujas objektas, naudojome a Stygos
, švaistytume daug atminties. Stygos
baseinas išsprendžia šią problemą kiekvienam saugodamas tik po vieną objektą Stygos
vertė, kaip parodyta žemiau.
Nors mes sukūrėme a Stygos
kintamasis Kunigaikštis
ir Juggy
Stygos
s, tik du objektai yra sukurti ir saugomi atminties kaupe. Norėdami sužinoti, pažiūrėkite į šį kodo pavyzdį. (Prisiminkime, kad==
“„ Java “operatorius naudojamas norint palyginti du objektus ir nustatyti, ar jie yra vienodi.)
Styginių žaislas = "Juggy"; String anotherJuggy = "Juggy"; System.out.println (juggy == anotherJuggy);
Šis kodas grįš tiesa
nes abu Stygos
s nurodo tą patį objektą Stygos
baseinas. Jų vertybės yra vienodos.
Išimtis: „naujas“ operatorius
Dabar pažvelkite į šį kodą - jis atrodo panašus į ankstesnį pavyzdį, tačiau yra skirtumas.
Styginis kunigaikštis = nauja styginė („kunigaikštis“); String anotherDuke = nauja styga („kunigaikštis“); System.out.println (kunigaikštis == kitas kunigaikštis);
Remiantis ankstesniu pavyzdžiu, galite manyti, kad šis kodas grįš tiesa
, bet iš tikrųjų melagingas
. Pridedant naujas
operatorius verčia kurti naują Stygos
atminties krūvoje. Taigi JVM sukurs du skirtingus objektus.
Gimtiniai metodai
A vietinis metodas „Java“ yra metodas, kuris bus sudarytas naudojant C kalbą, dažniausiai manipuliuojant atmintimi ir optimizuojant našumą.
Styginių grupės ir praktikanto () metodas
Norėdami laikyti a Stygos
viduje konors Stygos
baseinas, mes naudojame techniką, vadinamą Stygos
internavimas. Štai ką „Javadoc“ mums sako apie praktikantas ()
metodas:
/ ** * Pateikia eilutės objekto kanoninį vaizdą. * * Stygų telkinį, iš pradžių tuščią, prižiūri privatiai * klasė {@code String}. * * Kai iškviečiamas interno metodas, jei telkinyje jau yra * eilutė, lygi šiam objektui {@code String}, kurį nustato * metodas {@link #equals (Object)}, tada eilutė iš baseino yra * grįžo. Kitu atveju šis {@code String} objektas pridedamas prie * telkinio ir grąžinama nuoroda į šį {@code String} objektą. * * Iš to išplaukia, kad bet kurioms dviem eilutėms {@code s} ir {@code t} * {@code s.intern () == t.intern ()} yra {@code true} * tik tada, jei { @code s.equals (t)} yra {@code true}. * * Visos pažodinės eilutės ir eilutės vertinamos nuolatinės išraiškos yra * internuotos. Styginiai literalai yra apibrėžti * „Java ™“ kalbos specifikacijos 3.10.5 skyriuje. * * @ grąžina eilutę, kurios turinys yra tas pats, kaip ir šios eilutės, tačiau garantuojama, kad ji yra iš unikalių eilučių grupės. * @jls 3.10.5 Styginių literalai * / viešoji gimtoji styginių praktikantė ();
praktikantas ()
metodas naudojamas saugoti Stygos
s a Stygos
baseinas. Pirma, jis patikrina, ar Stygos
jūsų sukurtas jau yra baseine. Jei ne, tai sukuria naują Stygos
baseine. Užkulisiuose, logika Stygos
kaupimas pagrįstas „Flyweight“ modeliu.
Dabar pastebėkite, kas atsitinka, kai mes naudojame naujas
raktinis žodis priversti sukurti du Stygos
s:
Styginis kunigaikštis = nauja styginė („kunigaikštis“); Styginių kunigaikštis2 = nauja styginė („kunigaikštis“); System.out.println (kunigaikštis == kunigaikštis2); // Rezultatas čia bus klaidingas System.out.println (duke.intern () == duke2.intern ()); // Rezultatas čia bus teisingas
Skirtingai nuo ankstesnio pavyzdžio su naujas
raktinis žodis, šiuo atveju palyginimas pasirodo teisingas. Taip yra todėl, kad naudojant praktikantas ()
metodas užtikrina Stygos
s bus saugomi baseine.
Lygus metodas su stygų klase
lygi ()
metodas naudojamas patikrinti, ar dviejų „Java“ klasių būsena yra vienoda. Nes lygi ()
yra iš Objektas
klasę, tai paveldi kiekviena „Java“ klasė. Bet lygi ()
metodas turi būti ignoruojamas, kad jis veiktų tinkamai. Žinoma, Stygos
nepaiso lygi ()
.
Pažiūrėk:
viešoji loginė reikšmė lygi (Object anObject) {if (this == anObject) {return true; } if (anObject eilutės egzempliorius) {String aString = (String) anObject; if (koderis () == aString.coder ()) {return isLatin1 ()? StringLatin1.equals (reikšmė, aString.value): StringUTF16.equals (reikšmė, aString.value); }} return false; }
Kaip matote, būklė Stygos
klasės vertė turi būti lygi ()
o ne objekto nuoroda. Nesvarbu, ar objekto nuoroda skiriasi; valstybės būklė Stygos
bus lyginamos.
Labiausiai paplitę stygų metodai
Yra tik paskutinis dalykas, kurį turite žinoti prieš imdamiesi Stygos
palyginimo iššūkis. Apsvarstykite šiuos įprastus Stygos
klasė:
// Pašalina tarpus iš kraštų apipjaustymo () // Gauna poakį indeksuodamas substring (int beginIndex, int endIndex) // Grąžina String length () simbolių ilgį // Pakeičia eilutę, galima naudoti regex. ReplAll (eilutės regex, eilutės pakeitimas) // Patikrina, ar eilutėje yra nurodyta CharSequence (CharSequences)
Priimkite „String“ palyginimo iššūkį!
Išbandykime, ką sužinojote apie Stygos
klasės greitas iššūkis.
Šiame iššūkyje palyginsite keletą Stygos
s naudojant mūsų ištirtas sąvokas. Peržiūrėdami toliau pateiktą kodą, galite nustatyti kiekvieno jų galutinę vertę rezultatus kintamasis?
public class ComparisonStringChallenge {public static void main (String ... doYourBest) {String result = ""; rezultatas + = "galingas kodas" .trim () == "galingas kodas"? "0": "1"; rezultatas + = "FlexibleCode" == "FlexibleCode"? „2“: „3“; rezultatas + = nauja eilutė ("doYourBest") == nauja eilutė ("doYourBest")? „4“: „5“; rezultatas + = nauja eilutė ("noBugsProject"). yra lygi ("noBugsProject")? „6“: „7“; rezultatas + = nauja eilutė ("breakYourLimits"). intern () == new String ("breakYourLimits"). intern ()? „8“: „9“; System.out.println (rezultatas); }}
Kuris rezultatas rodo galutinę rezultatų kintamojo vertę?
A: 02468
B: 12469
C: 12579
D: 12568
Patikrinkite savo atsakymą čia.
Kas ką tik nutiko? Styginių elgesio supratimas
Pirmoje kodo eilutėje matome:
rezultatas + = "galingas kodas" .trim () == "galingas kodas"? "0": "1";
nors Stygos
bus tas pats po apkarpyti()
metodas yra naudojamas, Stygos
„Galingas kodas“
pradžioje buvo kitoks. Šiuo atveju palyginimas yra melagingas
, nes kai apkarpyti()
metodas pašalina erdves nuo sienų ir verčia kurti naują Stygos
su naujuoju operatoriumi.
Toliau matome:
rezultatas + = "FlexibleCode" == "FlexibleCode"? „2“: „3“;
Čia nėra paslapties, Stygos
jie yra vienodi Stygos
baseinas. Šis palyginimas grįžta tiesa
.
Toliau mes turime:
rezultatas + = nauja eilutė ("doYourBest") == nauja eilutė ("doYourBest")? „4“: „5“;
Naudojant naujas
rezervuotas raktinis žodis verčia sukurti du naujus Stygos
s, nesvarbu, ar jie lygūs, ar ne. Šiuo atveju palyginimas bus melagingas
net jei Stygos
vertės yra vienodos.
Kitas yra:
rezultatas + = nauja eilutė ("noBugsProject"). yra lygi ("noBugsProject")? „6“: „7“;
Nes mes naudojome lygi ()
metodas, vertė Stygos
bus lyginamas, o ne objekto egzempliorius. Tokiu atveju nesvarbu, ar objektai skiriasi, nes vertė lyginama. Šis palyginimas grįžta tiesa
.
Galiausiai turime:
rezultatas + = nauja eilutė ("breakYourLimits"). intern () == new String ("breakYourLimits"). intern ()? „8“: „9“;
Kaip jau matėte anksčiau, praktikantas ()
metodas pateikia Stygos
viduje konors Stygos
baseinas. Tiek Stygos
s nurodo tą patį objektą, todėl šiuo atveju palyginimas yra tiesa
.
Vaizdo iššūkis! Derinimo eilutės palyginimai
Derinimas yra vienas iš paprasčiausių būdų visiškai įsisavinti programavimo koncepcijas, kartu tobulinant kodą. Šiame vaizdo įraše galite sekti, kol aš derinu ir paaiškinu „Java Strings“ iššūkį:
Dažniausios stygų klaidos
Gali būti sunku žinoti, ar du Stygos
s rodo į tą patį objektą, ypač kai Stygos
yra ta pati reikšmė. Tai padeda prisiminti, kad naudojant rezervuotą raktinį žodį naujas
visada sukuria naują objektą atmintyje, net jei reikšmės yra vienodos.
Naudojant Stygos
metodai palyginti Objektas
nuorodos taip pat gali būti sudėtingos. Svarbiausia, jei metodas kažką pakeičia Stygos
, objektų nuorodos bus skirtingos.
Keli pavyzdžiai, padėsiantys paaiškinti:
System.out.println ("kunigaikštis" .trim () == "kunigaikštis" .trim ()) ;;
Šis palyginimas bus teisingas, nes apkarpyti()
metodas nesukuria naujo Stygos
.
System.out.println ("kunigaikštis" .trim () == "kunigaikštis" .trim ());
Šiuo atveju pirmasis apkarpyti()
metodas sugeneruos naują Stygos
nes metodas atliks savo veiksmą, todėl nuorodos bus skirtingos.
Pagaliau, kada apkarpyti()
vykdo savo veiksmą, jis sukuria naują Stygos
:
// Apipjaustymo metodo įgyvendinimas „String“ klasėje new String (Arrays.copyOfRange (val, index, index + len), LATIN1);
Ką prisiminti apie stygas
Stygos
jie yra nekintami, taigi aStygos
Būsena negali būti pakeista.- Norėdami išsaugoti atmintį, JVM saugo
Stygos
s aStygos
baseinas. Kai naujasStygos
yra sukurtas, JVM patikrina jo vertę ir nurodo jį į esamą objektą. Jei nėraStygos
su ta verte baseine, tada JVM sukuria naująStygos
. - Naudojant
==
operatorius palygina objekto nuorodą. Naudojantlygi ()
metodas lyginaStygos
. Ta pati taisyklė bus taikoma visiems objektams. - Naudojant
naujas
operatorius, naujasStygos
bus sukurtaStygos
baseinas, net jei yraStygos
su ta pačia verte.
Atsakymo raktas
Atsakymas į šį „Java“ varžovą yra D variantas. Rezultatas būtų 12568
.
Šią istoriją „Styginių palyginimai Java“ iš pradžių paskelbė „JavaWorld“.