Funcționări interioare ale șirurilor și metoda subșirurilor - 1

"Bună, Amigo!"

— Bună, Ellie.

"O să vă spun despre subșiruri. Un subșir este o parte a unui șir. Și cea mai comună operație efectuată pe șiruri (după combinarea mai multor șiruri împreună) este obținerea unui subșir."

7) Cum obțin o parte dintr-un șir?

"Metoda subșirului returnează o parte dintr-un șir. Această metodă are două versiuni."

„Prima versiune returnează subșirul specificat de indici de început și de sfârșit. Dar caracterul de la indexul de sfârșit nu este inclus! Dacă treceți numerele 1 și 3, atunci subșirul va conține doar al doilea și al treilea caracter (rețineți că indicile începe cu 0)."

„A doua versiune returnează subșirul începând de la indexul trecut până la sfârșitul șirului.”

Metoda(e) Exemplu(e)
String substring(int beginIndex, int endIndex)
String s = "Good news, everyone!";
s = s.substring(1,6);
Rezultat:

s == "ood n";
String substring(int beginIndex)
String s = "Good news, everyone!";
s = s.substring(1);

— E destul de simplu. Mulţumesc, Ellie.

„Îți voi explica și funcționarea internă a obiectelor String.”

„După cum probabil știți deja, String este o clasă imuabilă. Și ce avantaje ne oferă asta? După cum se întâmplă, unul dintre avantajele cheie este capacitatea de a obține un subșir. Dar mai întâi de toate.”

„În interior, un obiect String conține o matrice de caractere, ceea ce nu este atât de greu de ghicit. Dar stochează și alte două variabile: indexul primului caracter din matrice și numărul de caractere. Acum vă voi spune care sunt acestea. sunt folosite pentru.”

„Când creăm un subșir folosind metoda subșirului , este creat un nou obiect String .”

„Dar, în loc să stocheze o referință la o nouă matrice de caractere, obiectul stochează o referință la vechea matrice, precum și două variabile pe care le folosește pentru a determina partea din matricea originală de caractere care este asociată cu acesta.”

— N-am înțeles nimic din toate astea.

„Când este creat un subșir, matricea de caractere nu este copiată în noul obiect String. În schimb, ambele obiecte stochează o referință la matricea de caractere originală. Dar! Al doilea obiect stochează și două variabile: indexul său de pornire în matrice și numărul de caractere care aparțin subșirului."

"Verifică:"

Obținerea unui subșir Ce este stocat în subșir
String s = "mama";
Ce este stocat în s:

char[] value = {'m','a','m','a'};
offset = 0;
count = 4;
String s2 = s.substring(1);
Ce este stocat în s2:

char[] value = {'m','a','m','a'};
offset = 1;
count = 3;
String s3 = s.substring(1, 3);
Ce este stocat în s3:

char[] value = {'m','a','m','a'};
offset = 1;
count = 2;

„Toate cele trei șiruri stochează o referință la aceeași matrice de caractere, dar stochează și indexul primului și ultimului caracter care le aparțin. Sau, mai precis, indexul primului caracter și numărul de caractere.”

— Asta are sens acum.

„Așadar, dacă luați un șir de caractere lung de 10.000 de caractere și creați 10.000 de subșiruri de orice lungime, aceste subșiruri vor folosi foarte puțină memorie, deoarece matricea de caractere nu este duplicată. Aceste șiruri, pe care v-ați aștepta să le consumați mult de spațiu, va lua literalmente doar câțiva octeți.”

"Misto!"

„Dar ai putea face asta dacă ai putea modifica Strings?”

„Nu, cineva ar putea schimba primul șir, iar apoi toate subșirurile lui s-ar schimba și ele. Acum are sens de ce a făcut asta. Aceasta este o soluție foarte bună.”

"Ma bucur ca ti-a placut."