Un frammento di lezione con un mentore come parte del corso Codegym University. Iscriviti al corso completo.
"Ciao, Amigo! Oggi analizzeremo alcuni scenari più comuni che coinvolgono il lavoro con le stringhe. Ad esempio, sai come dividere una stringa in più parti?"
"Non te lo dirò subito, Ellie. Ma me lo dirai tu, vero?"
split()
metodo
"Ci sono diversi modi per farlo. Il primo modo per dividere una stringa in più parti è utilizzare il split()
metodo. Un'espressione regolare che definisce una stringa di delimitazione speciale deve essere passata come parametro. Imparerai cos'è un'espressione regolare in la ricerca delle raccolte Java .
Esempio:
Codice | Risultato |
---|---|
|
Il risultato sarà un array di tre stringhe:
|
Semplice, ma a volte questo approccio è eccessivo. Se sono presenti molti delimitatori (ad esempio spazi, caratteri di nuova riga, tabulazioni, punti), è necessario costruire un'espressione regolare piuttosto complessa."
"Beh, certo. E se è difficile da leggere, allora è difficile apportare modifiche.
StringTokenizer
classe
Un frammento di lezione con un mentore come parte del corso Codegym University. Iscriviti al corso completo.
"Java ha una classe speciale il cui intero compito è dividere una stringa in sottostringhe.
"Questa classe non usa espressioni regolari: invece, passi semplicemente una stringa composta da delimitatori. Il vantaggio di questo approccio è che non spezza l'intera stringa in pezzi tutti in una volta, ma invece si sposta dall'inizio alla fine di un passo alla volta.
La classe ha un costruttore e due metodi. Passiamo al costruttore una stringa che abbiamo diviso in parti e una stringa composta da un insieme di caratteri di delimitazione.
Metodi | Descrizione |
---|---|
|
Restituisce la sottostringa successiva |
|
Controlla se ci sono più sottostringhe. |
"Questa classe in qualche modo mi ricorda la classe Scanner, che ha anche metodi nextLine()
e hashNextLine()
.
"Questa è una buona osservazione che hai fatto. Puoi creare un StringTokenizer
oggetto con questo comando:
StringTokenizer name = new StringTokenizer(string, delimiters);
Dove stringa è la stringa da dividere in parti. E delimitatori è una stringa e ogni carattere in essa contenuto viene trattato come un delimitatore. Esempio:
Codice | Uscita console |
---|---|
|
|
"Notare che ogni carattere nella stringa passato nella seconda stringa al StringTokenizer
costruttore è considerato un separatore.
String.format()
metodo e StringFormatter
classe
"Un altro metodo interessante della classe String è format()
.
"Supponiamo che tu abbia varie variabili che memorizzano i dati. Come li visualizzi sullo schermo in una riga? Ad esempio, abbiamo alcuni dati (colonna di sinistra) e l'output desiderato (colonna di destra):
Codice | Uscita console |
---|---|
|
|
Il codice per un tale programma sarà simile a questo:
Codice del programma |
---|
|
"Sarai d'accordo con me che il codice non è molto leggibile. E se i nomi delle variabili fossero più lunghi, allora il codice diventerebbe ancora più difficile:
Codice del programma |
---|
|
"Sì, è una lettura difficile!"
"Non preoccuparti. Questa è una situazione comune nei programmi del mondo reale, quindi voglio parlarti di un modo per scrivere questo codice in modo più semplice e conciso.
String.format
"La String
classe ha un metodo statico format()
: ti consente di specificare un modello per assemblare una stringa con i dati. L'aspetto generale del comando è il seguente:
String name = String.format(pattern, parameters);
Esempio:
Codice | Risultato |
---|---|
|
|
|
|
|
|
"Il format()
primo parametro del metodo è una stringa di formato che contiene tutto il testo desiderato insieme a caratteri speciali chiamati identificatori di formato (come %d
e %s
) nei punti in cui è necessario inserire i dati.
"Il format()
metodo sostituisce questi %s
e %d
gli identificatori di formato con i parametri che seguono la stringa di formato nell'elenco dei parametri. Se vogliamo inserire una stringa, allora scriviamo . %s
Se vogliamo inserire un numero, allora l'identificatore di formato è %d
. Esempio:
Codice | Risultato |
---|---|
|
s è uguale a"a=1, b=4, c=3" |
"Ecco un breve elenco di identificatori di formato che possono essere utilizzati all'interno della stringa di formato:
Specificatore | Senso |
---|---|
|
String |
|
intero: byte , short , int ,long |
|
numero reale: float ,double |
|
boolean |
|
char |
|
Date |
|
% carattere |
"Questi specificatori indicano il tipo di dati, ma ci sono anche specificatori che indicano l'ordine dei dati. Per ottenere un argomento in base al suo numero (la numerazione parte da uno), devi scrivere " % 1$ d " invece di " %d ". Esempio:
Codice | Risultato |
---|---|
|
s è uguale a"a=13, b=12, c=11" |
%3$d
otterrà il terzo argomento, %2$d
otterrà il secondo argomento e %d
otterrà il primo argomento. Gli identificatori di formato %s
e %d
si riferiscono ad argomenti indipendentemente da identificatori come %3$d
o%2$s
Piscina di stringhe
"Ogni stringa specificata nel codice come stringa letterale viene archiviata in un'area di memoria chiamata the StringPool
mentre il programma è in esecuzione. StringPool
è un array speciale per la memorizzazione di stringhe. Il suo scopo è ottimizzare l'archiviazione delle stringhe:
"Innanzitutto, le stringhe specificate nel codice devono essere memorizzate da qualche parte, giusto? Il codice è costituito da comandi, ma i dati (in particolare le stringhe di grandi dimensioni) devono essere archiviati in memoria separatamente dal codice. Nel codice compaiono solo i riferimenti agli oggetti stringa.
"In secondo luogo, tutti i valori letterali stringa identici devono essere archiviati in memoria solo una volta. Ed è proprio così che funziona. Quando il codice della classe viene caricato dalla macchina Java, tutti i valori letterali stringa vengono aggiunti a se non sono già presenti. Se lo StringPool
sono già lì, allora usiamo semplicemente un riferimento di stringa dal file StringPool
.
Di conseguenza, se assegni lo stesso valore letterale a diverse variabili String nel tuo codice, queste variabili conterranno lo stesso riferimento. Verrà aggiunto un valore letterale a StringPool
only once. In tutti gli altri casi, il codice otterrà un riferimento alla stringa già caricata nel file StringPool
.
Ecco più o meno come funziona:
Codice | Utilizzo di StringPoll |
---|---|
|
|
"Ecco perché le variabili a
e b
memorizzeranno gli stessi riferimenti."
"Spero di aver capito tutto correttamente.
intern()
metodo.
"E la parte migliore è che puoi aggiungere a livello di codice qualsiasi stringa a StringPool
. Per fare ciò, devi solo chiamare il metodo String
della variabile .intern()
"Il intern()
metodo aggiungerà la stringa al StringPool
se non è già presente e restituirà un riferimento alla stringa nel file StringPool
.
"E cosa accadrà se due stringhe identiche vengono aggiunte all'utilizzo StringPool
del intern()
metodo?"
"Il metodo restituirà gli stessi riferimenti. Questo può essere utilizzato per confrontare le stringhe per riferimento. Esempio:
Codice | Nota |
---|---|
|
|
|
|
È improbabile che utilizzi spesso questo metodo. Detto questo, alla gente piace chiederlo nei colloqui di lavoro.
"Quindi, è meglio sapere che non sapere. Grazie, Ellie!"
GO TO FULL VERSION