Sobes.tech
Middle

V Androidu existují mapy, do kterých lze přidávat primitivní typy. Můžeš o tom říct víc?

sobes.tech AI

Odpověď od AI

Ano, pro práci s primitivními typy v Android SDK jsou k dispozici specializované implementace Map, optimalizované z hlediska výkonu a úspory paměti ve srovnání se standardním HashMap<K, V>.

Nejčastější:

  • SparseIntArray: Ukládá páry int klíčů a int hodnot.
  • SparseLongArray: Ukládá páry int klíčů a long hodnot.
  • SparseBooleanArray: Ukládá páry int klíčů a boolean hodnot.
  • LongSparseArray<E>: Ukládá páry long klíčů a objekty typu E.

Výhody použití těchto tříd:

  • Efektivita paměti: Používají vnitřní pole pro ukládání dat, čímž se vyhýbají režii spojené s vytvářením obalových objektů pro primitivní typy (Integer, Long, Boolean) a strukturou spojového seznamu HashMap.
  • Výkon: Operace vkládání, získávání a mazání jsou obvykle rychlejší, zejména při práci s velkým množstvím prvků, díky jednodušší vnitřní struktuře a vyhýbání se hashování u primitivních klíčů v případě SparseArray.

Příklad použití SparseIntArray:

// Vytvoření SparseIntArray
SparseIntArray sparseArray = new SparseIntArray();

// Přidání prvků
sparseArray.put(0, 100);
sparseArray.put(1, 200);
sparseArray.put(10, 300);

// Získání hodnoty podle klíče
int value = sparseArray.get(1); // value bude 200

// Získání hodnoty s výchozí hodnotou
int valueWithDefault = sparseArray.get(5, -1); // valueWithDefault bude -1

// Odstranění prvku podle klíče
sparseArray.delete(10);

// Iterace přes prvky
for (int i = 0; i < sparseArray.size(); i++) {
    int key = sparseArray.keyAt(i);
    int val = sparseArray.valueAt(i);
    // Logika zpracování key a val
}

Podobně se používají SparseLongArray, SparseBooleanArray a LongSparseArray. LongSparseArray vyžaduje specifikaci typu objektu, protože její hodnoty jsou objekty, nikoli primitivní typy.

Volba mezi standardním HashMap a specializovanými Sparse mapami závisí na vašich požadavcích:

  • Pokud jsou klíče libovolné objekty nebo primitivní typy, které nejsou int nebo long, použijte HashMap.
  • Pokud jsou klíče int nebo long a hodnoty primitivní typy nebo objekty v případě LongSparseArray, a je důležitá efektivita paměti a výkon, je vhodnější použít Sparse mapy.

Je důležité poznamenat, že Sparse mapy nejsou vlákny bezpečné. Pokud potřebujete vlákny bezpečnou implementaci, zvažte použití ConcurrentHashMap s obalovými objekty pro primitivní typy. Nicméně, ve většině případů v rámci UI vlákna Android aplikace, kde jsou tyto struktury často používány, není bezpečnost vláken problém.