Programavimas

Styginiai Java palyginimai

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 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 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.

Rafaelis Chinelato Del Nero

Nors mes sukūrėme a Stygos kintamasis Kunigaikštis ir JuggyStygoss, 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 Stygoss 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 Stygoss 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 Stygoss:

 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 Stygoss 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ą Stygoss 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, Stygosjie 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 Stygoss, 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 Stygoss 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 Stygoss rodo į tą patį objektą, ypač kai Stygosyra 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

  • Stygosjie yra nekintami, taigi a StygosBūsena negali būti pakeista.
  • Norėdami išsaugoti atmintį, JVM saugo Stygoss a Stygos baseinas. Kai naujas Stygos yra sukurtas, JVM patikrina jo vertę ir nurodo jį į esamą objektą. Jei nėra Stygos su ta verte baseine, tada JVM sukuria naują Stygos.
  • Naudojant == operatorius palygina objekto nuorodą. Naudojant lygi () metodas lygina Stygos. Ta pati taisyklė bus taikoma visiems objektams.
  • Naudojant naujas operatorius, naujas Stygos bus sukurta Stygos baseinas, net jei yra Stygos 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“.