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 kā 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 kā 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.
Lai gan mēs izveidojām a Stīga
mainīgais Hercogs
un Juggy
Stīga
s, 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īga
s 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īga
s 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īga
s:
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īga
s 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īga
s, 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īga
s 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īga
s 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īga
s 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īga
s norāda uz vienu un to pašu objektu, it īpaši, ja Stīga
s 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īga
s ir nemainīgi, tāpēc aStīga
Stāvokli nevar mainīt.- Lai saglabātu atmiņu, JVM saglabā
Stīga
s aStīga
baseins. Kad jaunsStīga
ir izveidots, JVM pārbauda tā vērtību un norāda uz esošu objektu. Ja navStīga
ar šo vērtību kopā, tad JVM izveido jaunuStīga
. - Izmantojot
==
operators salīdzina objekta atsauci. Izmantojotvienāds ()
metode salīdzinaStīga
. Tas pats noteikums tiks piemērots visiem objektiem. - Lietojot
jauns
operators, jaunsStīga
tiks izveidotsStīga
baseins, pat ja irStī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.