In Android, ci sono mappe in cui è possibile aggiungere tipi primitivi. Puoi parlarne più in dettaglio?
sobes.tech AI
Risposta dell'AI
Sì, per lavorare con tipi primitivi nel SDK Android, esistono implementazioni specializzate di Map, ottimizzate per le prestazioni e il risparmio di memoria rispetto al HashMap<K, V> standard.
Le più comuni sono:
SparseIntArray: memorizza coppie di chiaviinte valoriint.SparseLongArray: memorizza coppie di chiaviinte valorilong.SparseBooleanArray: memorizza coppie di chiaviinte valoriboolean.LongSparseArray<E>: memorizza coppie di chiavilonge oggetti di tipoE.
Vantaggi dell'uso di queste classi:
- Efficienza di memoria: usano array interni per memorizzare i dati, evitando i costi associati alla creazione di oggetti wrapper per tipi primitivi (
Integer,Long,Boolean) e alla struttura di lista collegata diHashMap. - Prestazioni: le operazioni di inserimento, recupero e rimozione sono generalmente più veloci, specialmente con molti elementi, grazie a una struttura interna più semplice e all'evitamento dell'hash per le chiavi primitive nel caso di SparseArray.
Esempio di utilizzo di SparseIntArray:
// Creazione di SparseIntArray
SparseIntArray sparseArray = new SparseIntArray();
// Aggiunta di elementi
sparseArray.put(0, 100);
sparseArray.put(1, 200);
sparseArray.put(10, 300);
// Recupero del valore tramite chiave
int value = sparseArray.get(1); // value sarà 200
// Recupero del valore tramite chiave con valore di default
int valueWithDefault = sparseArray.get(5, -1); // valueWithDefault sarà -1
// Rimozione di un elemento tramite chiave
sparseArray.delete(10);
// Iterazione sugli elementi
for (int i = 0; i < sparseArray.size(); i++) {
int key = sparseArray.keyAt(i);
int val = sparseArray.valueAt(i);
// Logica di elaborazione di key e val
}
Analogamente si usano SparseLongArray, SparseBooleanArray e LongSparseArray. LongSparseArray richiede di specificare il tipo di oggetto, poiché i valori sono oggetti e non tipi primitivi.
La scelta tra HashMap standard e le mappe Sparse specializzate dipende dai requisiti:
- Se le chiavi sono oggetti arbitrari o tipi primitivi diversi da
intolong, usareHashMap. - Se le chiavi sono
intolong, e i valori sono tipi primitivi o oggetti nel caso diLongSparseArray, e si desidera efficienza di memoria e prestazioni, è preferibile usare le mappe Sparse.
È importante notare che le mappe Sparse non sono thread-safe. Se si necessita di un'implementazione thread-safe, considerare l'uso di ConcurrentHashMap con oggetti wrapper per i primitivi. Tuttavia, nella maggior parte dei casi, nel thread dell'interfaccia utente di un'app Android, dove queste strutture sono spesso usate, la sicurezza thread non rappresenta un problema.