Sobes.tech
Middle

În Android, există hărți în care poți adăuga tipuri primitive. Poți să ne spui mai multe despre asta?

sobes.tech AI

Răspuns de la AI

Da, pentru lucrul cu tipuri primitive în SDK-ul Android, există implementări specializate de Map, optimizate pentru performanță și economisirea memoriei comparativ cu HashMap<K, V> standard.

Cele mai comune sunt:

  • SparseIntArray: stochează perechi de chei int și valori int.
  • SparseLongArray: stochează perechi de chei int și valori long.
  • SparseBooleanArray: stochează perechi de chei int și valori boolean.
  • LongSparseArray<E>: stochează perechi de chei long și obiecte de tip E.

Avantajele utilizării acestor clase:

  • Eficiență a memoriei: Utilizează array-uri interne pentru stocare, evitând costurile asociate creării de obiecte wrapper pentru tipuri primitive (Integer, Long, Boolean) și structura de listă legată HashMap.
  • Performanță: Operațiile de inserare, obținere și ștergere sunt, în general, mai rapide, mai ales când se lucrează cu un număr mare de elemente, datorită unei structuri interne mai simple și evitării hashing-ului pentru cheile primitive în cazul SparseArray.

Exemplu de utilizare a SparseIntArray:

// Crearea unui SparseIntArray
SparseIntArray sparseArray = new SparseIntArray();

// Adăugarea elementelor
sparseArray.put(0, 100);
sparseArray.put(1, 200);
sparseArray.put(10, 300);

// Obținerea valorii după cheie
int value = sparseArray.get(1); // valoarea va fi 200

// Obținerea valorii după cheie cu valoare implicită
int valueWithDefault = sparseArray.get(5, -1); // valoarea va fi -1

// Ștergerea elementului după cheie
sparseArray.delete(10);

// Iterarea peste elemente
for (int i = 0; i < sparseArray.size(); i++) {
    int key = sparseArray.keyAt(i);
    int val = sparseArray.valueAt(i);
    // Logica de procesare a cheii și valorii
}

Similar, se folosesc SparseLongArray, SparseBooleanArray și LongSparseArray. LongSparseArray necesită specificarea tipului de obiect, deoarece valorile sunt obiecte și nu tipuri primitive.

Alegerea între HashMap standard și hărțile Sparse specializate depinde de cerințele dvs.:

  • Dacă cheile sunt obiecte arbitrare sau tipuri primitive care nu sunt int sau long, utilizați HashMap.
  • Dacă cheile sunt int sau long, iar valorile sunt tipuri primitive sau obiecte în cazul LongSparseArray, și eficiența memoriei și performanța sunt importante, este preferabil să utilizați hărți Sparse.

Este important de menționat că hărțile Sparse nu sunt sigure pentru utilizarea în medii multi-thread. Dacă aveți nevoie de o implementare sigură pentru fire, luați în considerare utilizarea ConcurrentHashMap cu obiecte wrapper pentru primitive. Cu toate acestea, în cele mai multe cazuri, în firul UI al unei aplicații Android, unde sunt frecvent utilizate aceste structuri, siguranța firelor nu reprezintă o problemă.