Lavorazioni interne delle stringhe e metodo della sottostringa - 1

"Ciao, Amico!"

"Ciao, Eli."

"Ti parlerò delle sottostringhe. Una sottostringa è una parte di una stringa. E l'operazione più comune eseguita sulle stringhe (dopo aver combinato più stringhe insieme) è ottenere una sottostringa."

7) Come ottengo parte di una stringa?

"Il metodo substring restituisce parte di una stringa. Questo metodo ha due versioni."

"La prima versione restituisce la sottostringa specificata dagli indici iniziale e finale. Ma il carattere all'indice finale non è incluso! Se passi i numeri 1 e 3, la sottostringa conterrà solo il secondo e il terzo carattere (ricorda che gli indici iniziano con 0)."

"La seconda versione restituisce la sottostringa a partire dall'indice passato fino alla fine della stringa."

Metodo(i) Esempi
String substring(int beginIndex, int endIndex)
String s = "Good news, everyone!";
s = s.substring(1,6);
Risultato:

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

"È abbastanza semplice. Grazie, Ellie."

"Ti spiegherò anche il funzionamento interno degli oggetti String."

"Come probabilmente già saprai, String è una classe immutabile. E quali vantaggi ci offre? Si dà il caso che uno dei vantaggi principali sia la possibilità di ottenere una sottostringa. Ma andiamo con ordine."

"Internamente, un oggetto String contiene un array di caratteri, che non è così difficile da indovinare. Ma memorizza anche altre due variabili: l'indice del primo carattere nell'array e il conteggio dei caratteri. Ora ti dirò cosa sono usati per."

"Quando creiamo una sottostringa utilizzando il metodo substring , viene creato un nuovo oggetto String ."

"Ma, invece di memorizzare un riferimento a un nuovo array di caratteri, l'oggetto memorizza un riferimento al vecchio array e due variabili che utilizza per determinare la parte dell'array di caratteri originale ad esso associato."

"Non ho capito niente di tutto questo."

"Quando viene creata una sottostringa, l'array di caratteri non viene copiato nel nuovo oggetto String. Invece, entrambi gli oggetti memorizzano un riferimento all'array di caratteri originale. Ma! Il secondo oggetto memorizza anche due variabili: il suo indice iniziale nell'array e il numero di caratteri che appartengono alla sottostringa."

"Controlla:"

Ottenere una sottostringa Cosa è memorizzato all'interno della sottostringa
String s = "mama";
Cosa è memorizzato in s:

char[] value = {'m','a','m','a'};
offset = 0;
count = 4;
String s2 = s.substring(1);
Cosa è memorizzato in s2:

char[] value = {'m','a','m','a'};
offset = 1;
count = 3;
String s3 = s.substring(1, 3);
Cosa è memorizzato in s3:

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

"Tutte e tre le stringhe memorizzano un riferimento allo stesso array di caratteri, ma memorizzano anche l'indice del primo e dell'ultimo carattere che le riguardano. O più precisamente, l'indice del primo carattere e il conteggio dei caratteri."

"Adesso ha senso."

"Quindi, se prendi una stringa lunga 10.000 caratteri e crei 10.000 sottostringhe di qualsiasi lunghezza, queste sottostringhe useranno pochissima memoria, perché l'array di caratteri non è duplicato. Queste stringhe, che ti aspetteresti di usare molto di spazio, richiederà letteralmente solo un paio di byte."

"Freddo!"

"Ma potresti farlo se potessi modificare Strings?"

"No, qualcuno potrebbe cambiare la prima stringa, e quindi anche tutte le sue sottostringhe cambierebbero. Ora ha senso il motivo per cui l'hanno fatto. Questa è una soluzione davvero interessante."

"Sono felice che ti sia piaciuto."