Programmēšana

Stīgu salīdzinājumi Java valodā

Java valodā Stīga klase iekapsulē masīvu char. Vienkārši sakot, Stīga ir rakstzīmju masīvs, ko izmanto vārdu, teikumu vai citu vēlamo datu sastādīšanai.

Iekapsulēšana ir viens no visspēcīgākajiem objektorientētās programmēšanas jēdzieniem. Iekapsulēšanas dēļ jums tas nav jāzina darbojas Stīgu klase; jums vienkārši jāzina kas tās saskarnē izmantojamās metodes.

Kad paskatās uz Stīga klases Java, jūs varat redzēt, kā masīvs char ir iekapsulēts:

 public String (char value []) {this (vērtība, 0, vērtība.length, null); } 

Lai labāk izprastu iekapsulēšanu, apsveriet fizisku objektu: automašīnu. Vai jums jāzina, kā automašīna darbojas zem pārsega, lai ar to brauktu? Protams, nē, bet jums jāzina, ko dara automašīnas saskarnes: tādas kā akselerators, bremzes un stūre. Katra no šīm saskarnēm atbalsta noteiktas darbības: paātrina, bremzē, pagriezieties pa kreisi, pagriezieties pa labi. Tas pats ir objektorientētā programmēšanā.

Mans pirmais emuārs Java izaicinātāji sērija ieviesa metodes pārslodzi, kas ir tehnika Stīga klase plaši izmanto. Pārslodze var padarīt jūsu klases patiešām elastīgas, ieskaitot Stīga:

 publiskā virkne (virknes oriģināls) {} publiskā virkne (char vērtība [], int nobīde, int skaits) {} public virkne (int [] codePoints, int nobīde, int skaits) {} publiskā virkne (baitu baiti [], int nobīde , int garums, String charsetName) {} // Un tā tālāk ... ... 

Nevis mēģināt saprast, kā Stīga klases darbi, šis Java Challenger palīdzēs jums saprast kas tā dara un lai to izmantotu savā kodā.

Kas ir String baseins?

Stīga iespējams, ir Java visbiežāk izmantotā klase. Ja atmiņas kaudzē katru reizi tika izveidots jauns objekts, mēs izmantojām Stīga, mēs tērētu daudz atmiņas. The Stīga pool atrisina šo problēmu, katram katram saglabājot tikai vienu objektu Stīga vērtība, kā parādīts zemāk.

Rafaels Šinelato Del Nero

Lai gan mēs izveidojām a Stīga mainīgais Hercogs un JuggyStīgas, atmiņas kaudzē tiek izveidoti un saglabāti tikai divi objekti. Lai iegūtu pierādījumus, skatiet šo koda paraugu. (Atgādinām, ka==”Operētājsistēma Java tiek izmantota, lai salīdzinātu divus objektus un noteiktu, vai tie ir vienādi.)

 Stīgu juggy = "Juggy"; Stīga anotherJuggy = "Juggy"; System.out.println (juggy == citsJuggy); 

Šis kods atgriezīsies taisnība jo abi Stīgas norāda uz to pašu objektu Stīga baseins. Viņu vērtības ir vienādas.

Izņēmums: “jaunais” operators

Tagad apskatiet šo kodu - tas izskatās līdzīgs iepriekšējam paraugam, taču ir atšķirība.

 Stīgu hercogs = new String ("hercogs"); String anotherDuke = jauna virkne ("hercogs"); System.out.println (hercogs == cits hercogs); 

Pamatojoties uz iepriekšējo piemēru, jūs domājat, ka šis kods atgriezīsies taisnība, bet patiesībā nepatiesa. Pievienojot jauns operators liek radīt jaunu Stīga atmiņas kaudzē. Tādējādi JVM izveidos divus dažādus objektus.

Vietējās metodes

A vietējā metode Java valodā ir metode, kas tiks apkopota, izmantojot C valodu, parasti ar atmiņu manipulēšanai un veiktspējas optimizēšanai.

Stīgu baseini un intern () metode

Lai uzglabātu a Stīga iekš Stīga baseinu, mēs izmantojam tehniku, ko sauc Stīga internēšana. Lūk, ko Javadoc mums stāsta par interns () metode:

 / ** * Atgriež virknes objekta kanonisko attēlojumu. * * Sākotnēji tukšu virkņu kopu privāti uztur * klase {@code String}. * * Kad tiek izsaukta intern metode, ja pūlā jau ir * virkne, kas vienāda ar šo {@code String} objektu, kā to nosaka * metode {@link #equals (Object)}, tad pūlā esošā virkne ir * atgriezās. Pretējā gadījumā šis {@code String} objekts tiek pievienots * baseinam un tiek atgriezta atsauce uz šo {@code String} objektu. * * No tā izriet, ka jebkurām divām virknēm {@code s} un {@code t} * {@code s.intern () == t.intern ()} ir {@code true} * tikai un vienīgi tad, ja { @code s.equals (t)} ir {@code true}. * * Visas burtiskās virknes un virknes novērtētās nemainīgās izteiksmes tiek * internētas. Virknes literāļi ir definēti * Java ™ valodas specifikācijas 3.10.5. * * @atgriež virkni, kuras saturs ir tāds pats kā šai virknei, taču tiek garantēts, ka tā * nāk no unikālu virkņu kopas. * @jls 3.10.5 Stīgu literāti * / valsts dzimtā stīgu praktikants (); 

The interns () metodi izmanto uzglabāšanai Stīgas a Stīga baseins. Pirmkārt, tā pārbauda, ​​vai Stīga jūsu izveidotais saturs jau pastāv baseinā. Ja nē, tas rada jaunu Stīga baseinā. Aizkulisēs loģika Stīga apvienošanās pamatā ir Flyweight modelis.

Tagad pamaniet, kas notiek, kad mēs izmantojam jauns atslēgvārdu, lai piespiestu izveidot divus Stīgas:

 Stīgu hercogs = new String ("hercogs"); Stīgu hercogs2 = new String ("hercogs"); System.out.println (hercogs == hercogs2); // Rezultāts šeit būs kļūdains System.out.println (duke.intern () == duke2.intern ()); // Rezultāts šeit būs patiess 

Atšķirībā no iepriekšējā piemēra ar jauns atslēgvārdu, šajā gadījumā salīdzinājums izrādās patiess. Tas ir tāpēc, ka, izmantojot interns () metode nodrošina Stīgas tiks glabāti baseinā.

Vienāda ar Stīgu klasi

The vienāds () metodi izmanto, lai pārbaudītu, vai divu Java klašu stāvoklis ir vienāds. Tā kā vienāds () ir no Objekts klases, katra Java klase to pārmanto. Bet vienāds () metode ir jāpārvar, lai tā darbotos pareizi. Protams, Stīga ignorē vienāds ().

Paskaties:

 publiskais būla skaitlis ir vienāds ar (Object anObject) {if (this == anObject) {return true; } if (virknes anObject instance) {String aString = (String) anObject; if (kodētājs () == aString.coder ()) {return isLatin1 ()? StringLatin1.equals (vērtība, aString.value): StringUTF16.equals (vērtība, aString.value); }} return false; } 

Kā redzat, stāvoklis Stīga klases vērtībai jābūt vienāds () nevis objekta atsauce. Nav svarīgi, vai objekta atsauce ir atšķirīga; valsts Stīga tiks salīdzināts.

Visizplatītākās stīgu metodes

Ir tikai viena pēdējā lieta, kas jums jāzina, pirms lietojat Stīga salīdzināšanas izaicinājums. Apsveriet šīs kopējās metodes Stīga klase:

 // Noņem atstarpes no apmales apdares () // Iegūst apakšvirsmu, indeksējot apakšvirkni (int beginIndex, int endIndex) // Atgriež String length () rakstzīmju garumu // Aizstāj virkni, var izmantot regex. aizstāt visu (virknes regex, virknes aizstāšana) // Pārbauda, ​​vai virknē ir norādīts CharSequence satur (CharSequences) 

Piedalieties String salīdzināšanas izaicinājumā!

Izmēģināsim to, ko esat uzzinājis par Stīga klase ātrā izaicinājumā.

Šajā izaicinājumā jūs salīdzināsiet vairākus Stīgas, izmantojot mūsu izpētītos jēdzienus. Aplūkojot zemāk redzamo kodu, vai varat noteikt katra galīgo vērtību rezultātiem mainīgs?

 public class ComparisonStringChallenge {public static void main (String ... doYourBest) {Stīgas rezultāts = ""; rezultāts + = "jaudīgs kods" .trim () == "jaudīgs kods"? "0": "1"; rezultāts + = "FlexibleCode" == "FlexibleCode"? "2": "3"; rezultāts + = jauna virkne ("doYourBest") == jauna virkne ("doYourBest")? "4": "5"; rezultāts + = jauna virkne ("noBugsProject"). ir vienāda ("noBugsProject")? "6": "7"; rezultāts + = jauna virkne ("breakYourLimits"). intern () == new String ("breakYourLimits"). intern ()? "8": "9"; System.out.println (rezultāts); }} 

Kura izeja atspoguļo rezultātu mainīgā galīgo vērtību?

A: 02468

B: 12469

C: 12579

D: 12568

Pārbaudiet savu atbildi šeit.

Kas tikko notika? Izpratne par stīgu uzvedību

Koda pirmajā rindiņā mēs redzam:

 rezultāts + = "jaudīgs kods" .trim () == "jaudīgs kods"? "0": "1"; 

Lai gan Stīga tāpat būs pēc apdare () metode tiek izmantota, Stīga“Spēcīgs kods” sākumā bija savādāka. Šajā gadījumā salīdzinājums ir nepatiesa, jo, kad apdare () metode noņem atstarpes no robežām, tā liek radīt jaunu Stīga ar jauno operatoru.

Tālāk mēs redzam:

 rezultāts + = "FlexibleCode" == "FlexibleCode"? "2": "3"; 

Šeit nav noslēpuma Stīgas ir vienādi Stīga baseins. Šis salīdzinājums atgriežas taisnība.

Tālāk mums ir:

 rezultāts + = jauna virkne ("doYourBest") == jauna virkne ("doYourBest")? "4": "5"; 

Izmantojot jauns rezervētais atslēgvārds liek izveidot divus jaunus Stīgas neatkarīgi no tā, vai viņi ir vienādi vai nē. Šajā gadījumā salīdzinājums būs nepatiesa pat ja Stīga vērtības ir vienādas.

Nākamais ir:

 rezultāts + = jauna virkne ("noBugsProject"). ir vienāda ("noBugsProject")? "6": "7"; 

Tāpēc, ka mēs esam izmantojuši vienāds () metode, vērtība Stīga tiks salīdzināts, nevis objekta instance. Tādā gadījumā nav svarīgi, vai objekti atšķiras, jo tiek salīdzināta vērtība. Šis salīdzinājums atgriežas taisnība.

Visbeidzot, mums ir:

 rezultāts + = jauna virkne ("breakYourLimits"). intern () == new String ("breakYourLimits"). intern ()? "8": "9"; 

Kā jūs jau iepriekš redzējāt, interns () metode liek Stīga iekš Stīga baseins. Abi Stīgas norāda uz to pašu objektu, tāpēc šajā gadījumā salīdzinājums ir taisnība.

Video izaicinājums! Atkļūdošanas virkņu salīdzinājumi

Atkļūdošana ir viens no vienkāršākajiem veidiem, kā pilnībā absorbēt programmēšanas koncepcijas, vienlaikus uzlabojot arī kodu. Šajā videoklipā varat sekot līdzi, kamēr es atkļūdoju un izskaidroju Java virkņu izaicinājumu:

Biežas kļūdas ar stīgām

Var būt grūti uzzināt, vai divi Stīgas norāda uz vienu un to pašu objektu, it īpaši, ja Stīgas satur to pašu vērtību. Tas palīdz atcerēties, ka rezervētā atslēgvārda izmantošana jauns vienmēr atmiņā tiek izveidots jauns objekts, pat ja vērtības ir vienādas.

Izmantojot Stīga metodes salīdzināšanai Objekts atsauces var būt arī sarežģītas. Galvenais ir, ja metode kaut ko maina Stīga, objektu atsauces būs atšķirīgas.

Daži piemēri, kas palīdzēs precizēt:

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

Šis salīdzinājums būs patiess, jo apdare () metode nerada jaunu Stīga.

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

Šajā gadījumā pirmais apdare () metode ģenerēs jaunu Stīga jo metode veiks savu darbību, tāpēc atsauces būs atšķirīgas.

Visbeidzot, kad apdare () izpilda savu darbību, tas rada jaunu Stīga:

 // Apgriešanas metodes ieviešana String klasē jaunā String (Arrays.copyOfRange (val, index, index + len), LATIN1); 

Kas jāatceras par Stīgām

  • Stīgas ir nemainīgi, tāpēc a StīgaStāvokli nevar mainīt.
  • Lai saglabātu atmiņu, JVM saglabā Stīgas a Stīga baseins. Kad jauns Stīga ir izveidots, JVM pārbauda tā vērtību un norāda uz esošu objektu. Ja nav Stīga ar šo vērtību kopā, tad JVM izveido jaunu Stīga.
  • Izmantojot == operators salīdzina objekta atsauci. Izmantojot vienāds () metode salīdzina Stīga. Tas pats noteikums tiks piemērots visiem objektiem.
  • Lietojot jauns operators, jauns Stīga tiks izveidots Stīga baseins, pat ja ir Stīga ar tādu pašu vērtību.

 

Atbildes atslēga

Atbilde uz šo Java izaicinātāju ir D. variants. Rezultāts būtu 12568.

Šo stāstu "Stīgu salīdzinājumi Java" sākotnēji publicēja JavaWorld.

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