Programiranje

Primerjave nizov v Javi

V Javi je Vrvica class zajema matriko char. Preprosto povedano Vrvica je niz znakov, ki se uporabljajo za sestavljanje besed, stavkov ali drugih želenih podatkov.

Enkapsulacija je eden najmočnejših konceptov v objektno usmerjenem programiranju. Zaradi inkapsulacije vam ni treba vedeti kako razred String deluje; samo vedeti morate kaj metode za uporabo na vmesniku.

Ko pogledate Vrvica razreda v Javi lahko vidite, kako deluje vrsta char je zaprto:

 javni String (vrednost char []) {this (vrednost, 0, value.length, null); } 

Za boljše razumevanje inkapsulacije upoštevajte fizični predmet: avto. Ali morate vedeti, kako avto deluje pod pokrovom motorja, da ga lahko vozite? Seveda ne, vendar morate vedeti, kaj počnejo vmesniki avtomobila: stvari, kot so plin, zavore in volan. Vsak od teh vmesnikov podpira določena dejanja: pospeševanje, zaviranje, zavijanje levo, zavijanje desno. Enako je pri objektno usmerjenem programiranju.

Moj prvi blog v Java izzivalci serija je predstavila metodo preobremenitve, ki je tehnika Vrvica razred široko uporablja. Zaradi preobremenitve lahko vaši razredi postanejo zelo prilagodljivi, tudi Vrvica:

 javni niz (izvirnik niza) {} javni niz (vrednost znaka [], odmik int, števec int) {} javni niz (int [] kodne točke, odmik int, števec int) {} javni niz (bajtni bajti [], odmik int , int length, String charsetName) {} // In tako naprej ... ... 

Namesto da bi poskušal razumeti, kako Vrvica razred deluje, ta Java Challenger vam bo pomagal razumeti kaj to počne in kako da ga uporabite v svoji kodi.

Kaj je String pool?

Vrvica je verjetno najpogosteje uporabljen razred v Javi. Če je bil na predmetu na novo ustvarjen nov predmet, ko smo uporabili a Vrvica, zapravili bi veliko spomina. The Vrvica pool to težavo reši tako, da shrani samo en predmet za vsakega Vrvica vrednost, kot je prikazano spodaj.

Rafael Chinelato Del Nero

Čeprav smo ustvarili a Vrvica spremenljivka za vojvoda in JuggyVrvicas, samo dva predmeta sta ustvarjena in shranjena v kopici pomnilnika. Za dokaz si oglejte naslednji vzorec kode. (Spomnimo se, da „=="V Java se uporablja za primerjavo dveh predmetov in ugotavljanje, ali sta enaka.)

 String juggy = "Juggy"; String anotherJuggy = "Juggy"; System.out.println (juggy == drugiJuggy); 

Ta koda se bo vrnila prav ker sta oba Vrvicas kažejo na isti predmet v Vrvica bazen. Njihove vrednote so enake.

Izjema: "novi" operater

Zdaj si oglejte to kodo - izgleda podobno kot prejšnji vzorec, vendar obstaja razlika.

 String duke = new String ("vojvoda"); String anotherDuke = nov niz ("vojvoda"); System.out.println (duke == anotherDuke); 

Glede na prejšnji primer lahko mislite, da se bo ta koda vrnila prav, ampak v resnici je napačno. Dodajanje novo operater prisili k ustvarjanju novega Vrvica v spominskem kupu. Tako bo JVM ustvaril dva različna predmeta.

Native metode

A izvorna metoda v Javi je metoda, ki se bo prevedla z uporabo jezika C, običajno z namenom manipulacije s pomnilnikom in optimizacije delovanja.

Nizi nizov in metoda intern ()

Za shranjevanje Vrvica v Vrvica pool uporabljamo tehniko imenovano Vrvica interniranje. Evo, kaj nam Javadoc pove o pripravnik() metoda:

 / ** * Vrne kanonično predstavitev za nizni objekt. * * Skupino nizov, ki je bila sprva prazna, zasebno vzdržuje razred * {@code String}. * * Ko je poklicana metoda intern, če področje že vsebuje * niz, enak temu objektu {@code String}, kot ga določa metoda {@link #equals (Object)}, je niz iz bazena * vrnil. V nasprotnem primeru se ta objekt {@code String} doda v bazen * in vrne se sklic na ta objekt {@code String}. * * Iz tega sledi, da je za poljubna dva niza {@code s} in {@code t} * {@code s.intern () == t.intern ()} {@code true} *, če in samo, če { @code s.equals (t)} je {@code true}. * * Vsi dobesedni nizi in konstantni izrazi z vrednostjo niza so internirani. Stralni literali so opredeljeni v oddelku 3.10.5 * Jezikovne specifikacije Java ™. * * @ vrne niz, ki ima enako vsebino kot ta niz, vendar je zajamčeno, da * izhaja iz nabora unikatnih nizov. * @jls 3.10.5 String Literals * / public native String intern (); 

The pripravnik() metoda se uporablja za shranjevanje Vrvicas v a Vrvica bazen. Najprej preveri, ali je Vrvica ki ste ga ustvarili, že obstaja v bazenu. Če ne, ustvari novo Vrvica v bazenu. V zakulisju logika Vrvica združevanje temelji na vzorcu Flyweight.

Zdaj pa opazite, kaj se zgodi, ko uporabimo novo ključno besedo, ki bo prisilila k ustvarjanju dveh Vrvicas:

 String duke = new String ("vojvoda"); String duke2 = new String ("duke"); System.out.println (vojvoda == vojvoda2); // Tu bo rezultat napačen System.out.println (duke.intern () == duke2.intern ()); // Rezultat bo tukaj resničen 

Za razliko od prejšnjega primera z novo ključna beseda, v tem primeru se izkaže, da je primerjava resnična. To je zato, ker uporaba pripravnik() metoda zagotavlja Vrvicas bodo shranjeni v bazenu.

Metoda enaka razredu String

The enako () metoda se uporablja za preverjanje, ali sta dve razredi Java enaki. Ker enako () je iz Predmet razreda, ga podeduje vsak razred Java. Toda enako () je treba preglasiti, da deluje pravilno. Seveda, Vrvica preglasi enako ().

Poglej:

 javna logična vrednost je enako (Object anObject) {if (this == anObject) {return true; } if (anObject instanceof String) {String aString = (String) anObject; if (coder () == aString.coder ()) {return isLatin1 ()? StringLatin1.equals (vrednost, aString.value): StringUTF16.equals (vrednost, aString.value); }} vrne false; } 

Kot lahko vidite, je stanje v Vrvica vrednost razreda mora biti enako () in ne sklic na objekt. Ni pomembno, ali je sklic na objekt drugačen; država Vrvica bodo primerjali.

Najpogostejše metode nizov

Obstaja samo še ena stvar, ki jo morate vedeti, preden vzamete Vrvica primerjalni izziv. Upoštevajte te običajne metode Vrvica razred:

 // Odstrani presledke iz obrobe trim () // Pride podniz po indeksih podniz (int beginIndex, int endIndex) // Vrne dolžino znakov dolžine niza () // Nadomešča niz, lahko se uporabi regularni izraz. replaceAll (regularni izraz niza, zamenjava niza) // preveri, ali je v nizu določena oznaka CharSequence (CharSequences) 

Sprejmite izziv primerjave nizov!

Preizkusimo, kaj ste se naučili o Vrvica razred v hitrem izzivu.

Za ta izziv boste primerjali številne Vrvicas koncepti, ki smo jih raziskali. Če pogledate spodnjo kodo, lahko določite končno vrednost vsake rezultatov spremenljivka?

 javni razred ComparisonStringChallenge {javna statična void main (String ... doYourBest) {String rezultat = ""; rezultat + = "močna koda" .trim () == "močna koda"? "0": "1"; rezultat + = "gibljiva koda" == "prilagodljiva koda"? "2": "3"; rezultat + = nov niz ("doYourBest") == nov niz ("doYourBest")? "4": "5"; rezultat + = nov niz ("noBugsProject") .equals ("noBugsProject")? "6": "7"; rezultat + = nov niz ("breakYourLimits"). intern () == nov niz ("breakYourLimits"). intern ()? "8": "9"; System.out.println (rezultat); }} 

Kateri izhod predstavlja končno vrednost spremenljivke rezultatov?

A: 02468

B: 12469

C: 12579

D: 12568

Odgovor preverite tukaj.

Kaj se je pravkar zgodilo? Razumevanje vedenja nizov

V prvi vrstici kode vidimo:

 rezultat + = "močna koda" .trim () == "močna koda"? "0": "1"; 

Čeprav je Vrvica bo enako po obrezati () se prikliče metoda, Vrvica"Močna koda" je bilo na začetku drugačno. V tem primeru je primerjava napačno, ker ko obrezati () metoda odstranjuje presledke z meja, zaradi česar je treba ustvariti novo Vrvica z novim operaterjem.

Nato vidimo:

 rezultat + = "gibljiva koda" == "prilagodljiva koda"? "2": "3"; 

Tu ni nobene skrivnosti Vrvicaso enaki v Vrvica bazen. Ta primerjava se vrne prav.

Nato imamo:

 rezultat + = nov niz ("doYourBest") == nov niz ("doYourBest")? "4": "5"; 

Uporabljati novo rezervirana ključna beseda prisili k ustvarjanju dveh novih Vrvicas, ne glede na to, ali so enaki ali ne. V tem primeru bo primerjava napačno tudi če Vrvica vrednosti so enake.

Sledi:

 rezultat + = nov niz ("noBugsProject") .equals ("noBugsProject")? "6": "7"; 

Ker smo uporabili enako () metoda, vrednost Vrvica bo primerjal in ne primerek predmeta. V tem primeru ni vseeno, ali so predmeti drugačni, ker se vrednost primerja. Ta primerjava se vrne prav.

Na koncu imamo še:

 rezultat + = nov niz ("breakYourLimits"). intern () == nov niz ("breakYourLimits"). intern ()? "8": "9"; 

Kot ste že videli, pripravnik() metoda postavlja Vrvica v Vrvica bazen. Oboje Vrvicas kažejo na isti predmet, zato je v tem primeru primerjava prav.

Video izziv! Primerjave nizov za odpravljanje napak

Odpravljanje napak je eden najlažjih načinov za popolno absorpcijo konceptov programiranja, hkrati pa izboljšate kodo. V tem videu lahko sledite, medtem ko odpravljam napake in razlagam izziv Java Strings:

Pogoste napake z Strings

Težko je vedeti, če dva Vrvicas kažejo na isti predmet, še posebej, če Vrvicavsebujejo enako vrednost. Pomaga si zapomniti, da z uporabo rezervirane ključne besede novo vedno povzroči, da se v pomnilniku ustvari nov objekt, tudi če so vrednosti enake.

Uporaba Vrvica metode za primerjavo Predmet sklici so lahko tudi zapleteni. Ključno je, če metoda kaj spremeni v Vrvica, sklici na objekte bodo drugačni.

Nekaj ​​primerov za razjasnitev:

 System.out.println ("vojvoda" .trim () == "vojvoda" .trim ()) ;; 

Ta primerjava bo resnična, ker obrezati () metoda ne ustvari novega Vrvica.

 System.out.println ("vojvoda" .trim () == "vojvoda" .trim ()); 

V tem primeru prvi obrezati () metoda bo ustvarila novo Vrvica ker bo metoda izvedla svoje dejanje, zato bodo sklici drugačni.

Končno, kdaj obrezati () izvede svoje dejanje, ustvari novo Vrvica:

 // Izvajanje metode trim v razredu String new String (Arrays.copyOfRange (val, index, index + len), LATIN1); 

Kaj si je treba zapomniti pri godbah

  • Vrvicaso nespremenljive, zato a VrvicaDržave ni mogoče spremeniti.
  • Za ohranitev spomina JVM hrani Vrvicas v a Vrvica bazen. Ko novo Vrvica se ustvari, JVM preveri njegovo vrednost in jo usmeri na obstoječi objekt. Če ni Vrvica s to vrednostjo v področju, potem JVM ustvari novo Vrvica.
  • Uporabljati == operator primerja referenco predmeta. Uporabljati enako () metoda primerja vrednost Vrvica. Za vse predmete bo veljalo isto pravilo.
  • Ko uporabljate novo operater, novo Vrvica bo ustvarjen v Vrvica bazen, tudi če obstaja Vrvica z enako vrednostjo.

 

Tipka za odgovor

Odgovor na ta izzivalec Java je možnost D. Rezultat bi bil 12568.

To zgodbo "Primerjave nizov v Javi" je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found