Sobes.tech
Middle

V Androidi existujú mapy, do ktorých môžete pridávať primitívne typy. Môžete o tom povedať viac?

sobes.tech AI

Odpoveď od AI

Áno, na prácu s primitívnymi typmi v Android SDK existujú špecializované implementácie Map, optimalizované z hľadiska výkonu a úspory pamäte v porovnaní so štandardným HashMap<K, V>.

Najbežnejšie:

  • SparseIntArray: Ukladá páry int kľúčov a int hodnôt.
  • SparseLongArray: Ukladá páry int kľúčov a long hodnôt.
  • SparseBooleanArray: Ukladá páry int kľúčov a boolean hodnôt.
  • LongSparseArray<E>: Ukladá páry long kľúčov a objektov typu E.

Výhody použitia týchto tried:

  • Efektívnosť pamäte: Používajú vnútorné polia na ukladanie dát, čím sa vyhýbajú režii spojené s vytváraním obalových objektov pre primitívne typy (Integer, Long, Boolean) a štruktúrou spojeného zoznamu HashMap.
  • Výkon: Operácie vkladania, získavania a odstraňovania sú zvyčajne rýchlejšie, najmä pri práci s veľkým množstvom prvkov, vďaka jednoduchšej vnútornej štruktúre a vyhýbaniu sa hashovaniu pri SparseArray.

Príklad použitia SparseIntArray:

// Vytvorenie SparseIntArray
SparseIntArray sparseArray = new SparseIntArray();

// Pridanie prvkov
sparseArray.put(0, 100);
sparseArray.put(1, 200);
sparseArray.put(10, 300);

// Získanie hodnoty podľa kľúča
int value = sparseArray.get(1); // hodnota bude 200

// Získanie hodnoty s predvolenou hodnotou
int valueWithDefault = sparseArray.get(5, -1); // hodnota bude -1

// Odstránenie prvku podľa kľúča
sparseArray.delete(10);

// Iterácia cez prvky
for (int i = 0; i < sparseArray.size(); i++) {
    int key = sparseArray.keyAt(i);
    int val = sparseArray.valueAt(i);
    // Logika spracovania key a val
}

Podobne sa používajú SparseLongArray, SparseBooleanArray a LongSparseArray. LongSparseArray vyžaduje špecifikáciu typu objektu, pretože jej hodnoty sú objekty, nie primitívne typy.

Voľba medzi štandardným HashMap a špecializovanými Sparse mapami závisí od vašich požiadaviek:

  • Ak sú kľúče ľubovoľné objekty alebo primitívne typy, ktoré nie sú int alebo long, použite HashMap.
  • Ak sú kľúče int alebo long a hodnoty sú primitívne typy alebo objekty v prípade LongSparseArray, a je dôležitá efektívnosť pamäte a výkon, je vhodnejšie použiť Sparse mapy.

Je dôležité poznamenať, že Sparse mapy nie sú vlákno-bezpečné. Ak potrebujete vlákno-bezpečnú implementáciu, zvážte použitie ConcurrentHashMap s obalovými objektmi pre primitívne typy. Avšak, vo väčšine prípadov v rámci UI vlákna Android aplikácie, kde sú tieto štruktúry často používané, bezpečnosť vlákien nie je problém.