Kotlin: le stringhe
In Kotlin, così come in Java, le stringe sono immutable nel senso che una volta che viene creata una stringa questa viene immagazzinata nella heap memory in quello che viene chiamato string pool. Se due variabili assumono la stessa stringa, questa non viene creata due volte ma entrambe le variabili puntano la stessa area di memoria. Nel caso in cui ad una delle due variabili viene modificato il contenuto, allora viene creata una nuova stringa nella heap memory (se non esiste già nello string pool) e le due variabili andranno a puntare aree diverse di memoria. Quando una stringa dello string pool non è più connessa a nessuna variabile, essa viene rimossa liberando memoria.
Essendo immutable, per creare una stringa vuota, è necessario utilizzare la seguente sintassi (creazione di un nuovo oggetto di tipo stringa):
var s = String()
Ricordiamo che ad una variabile di tipo stringa non si può associare ne un carattere (tipo ‘p’) ne un numero (come ad esempio 2). Allo stesso tempo le Stringhe sono array di caratteri e pertanto è possibile accedere al valore di un suo elemento caratterizzato da un indice (index) utilizzando le parentesi quadre [index].
Proprietà e funzioni delle stringhe
Tra le proprietà associate ad una Stringa (str) ricordiamo le più comuni:
- lenght: ritorna il numero di caratteri che compone la stringa (formato Int). Esempio di utilizzo: str.lenght
- indices: ritorna il range degli indici della stringa intesa come array di caratteri (formato IntRange). Esempio di utilizzo str.indices
- lastIndex: ritorna l’indice dell’ultimo carattere della stringa intesa come array di caratteri (formato Int). Esempio di utilizzo str.lastIndex
Tra le funzioni associate ad una Stringa (str) ricordiamo le più comuni:
- get: ritorna il carattere relativo ad un determinato indice (index). Esempio di utilizzo: str.get(index)
- subSequence: ritorna la sotto-stringa compresa tra un indice iniziale (startIndex) ed uno finale (endIndex). Esempio di utilizzo str.subSequence(startIndex, endIndex)
- compareTo: data una seconda stringa (str2), fa il confronto tra stringhe. Se le due sono uguali torna 0, se str < str2 allora torna un numero positivo. E’ possibile passare come opzione true per rendere il confronto case insensitive. Esempi di utilizzo str.compareTo(str2) oppure str.compareTo(str2, true)
- plus : come l’operatore + permette di concatenare due stringhe. Esempio di utilizzo è, data una seconda stringa str2 da concatenare str.plus(str2)
- contains : data una seconda stringa (str2), ritorna un booleano che indica se la stringa str2 è contenuta nella stringa str. Esempio di utilizzo str.contains(str2)
- count : ritorna la lunghezza (di tipo Int) della stringa. Esempio di utilizzo str.count()
- drop : ritorna una stringa uguale a quella originale ad eccezione dei primi N caratteri. Esempio di utilizzo str.drop(N)
- dropLast : ritorna una stringa uguale a quella originale ad eccezione degli ultimi N caratteri. Esempio di utilizzo str.dropLast(N)
- dropWhile : ritorna una stringa uguale a quella originale ad eccezione dei caratteri precedenti alla condizione soddisfatta dalla funzione fun : (Char) -> Boolean. Esempio di utilizzo str.dropWhile({ it != ‘K’ })
- elementAt : come la funzione get, torna il carattere (di tipo Char) relativo ad un determinato indice (index). Esempio di utilizzo str.elementAt(index)
- indexOf : restituisce l’indice della prima occorrenza di un determinato carattere a partire dall’indice index ignorando (true) o meno (false) le maiuscole. Esempio di utilizzo str.indexOf(‘K’, index, false)
- indexOfFirst : restiuisce la prima occorrenza di un determinato carattere che soddisfa una certa funzione fun : (Char) -> Boolean. Esempio di utilizzo: str.indexOfFirst({it == ‘K’})
- indexOfLast : restiuisce l’ultima occorrenza di un determinato carattere che soddisfa una certa funzione fun : (Char) -> Boolean. Esempio di utilizzo: str.indexOfLast({it == ‘o’})
- getOrElse : ritorna il carattere di un determinato indice index oppure il valore restituito dalla una certa funzione fun : (Int) -> Char nel caso in cui l’indice sia fuori dal range. Esempio di utilizzo str.getOrElse(5, { ‘!’ })
- getOrNull : ritorna il carattere di un determinato indice index oppure il valore null. Esempio di utilizzo str.getOrNull(5)
- == (negazione !==): data una seconda stringa (str2) confronta se il contenuto di str ed str2 è lo stesso. Esempio di utilizzo str == str2.
- === (negazione !===): data una seconda stringa (str2) confronta se i puntatori per i due oggetti sono gli stessi. Esempio di utilizzo str === str2. In particolare siano date str ed str2 stringhe uguali e la stringa str3 concatenazione di due stringhe il cui risultato è la stessa stringa di str. Allora str == str2 ed str2==str3 ma mentre str === str2 in quanto puntano alla stessa stringa nella string pool, la stringa str3 punta ad una differente area di memoria della string pool. Pertanto str2 !=== str3
- +: permette di concatenare una stringa ad un valore di qualsiasi altro tipo a patto che il primo sia una stringa. Esempio di utilizzo str + 2 oppure str + ‘a’
La lista di tutte le funzioni e proprietà delle stringhe e la loro compatibilità con le librerie comuni di Kotlin indipendenti dall’architettura (common) e quelle dipendenti dall’architettura utilizzata (native, JVM e JS) è riportata in https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/ .
Ricordiamo poi i caratteri di escape supportati da Kotlin:
- \n: nuova linea
- \r: carriage return
- \t: tab
- \b: backspace
- \”: doppi apici
- \’: singolo apice
- \\: backslash
- “””: i tripli apici sono utilizzati per scrivere una stringa conenente spazi, apici e a capo senza utilizzare i comandi di escape (row string).
Infine tra i caratteri di escape ricordiamo \$ utilizzato nei String Template. Questo permette di inserire (concatenare) variabili ed espressioni in una stringa. Esempi di utilizzo sono “Il numero di caratteri della stringa str è ${str.lenght}” oppure “Il valore della variabile numero è $numero” dove numero ad esempio è una variabile numerica.
Commenti recenti