Sobes.tech
Middle

W Androidzie istnieją mapy, do których można dodawać typy prymitywne. Czy możesz opowiedzieć o tym więcej?

sobes.tech AI

Odpowiedź od AI

Tak, w SDK Android dostępne są specjalistyczne implementacje Map do pracy z typami prymitywnymi, zoptymalizowane pod kątem wydajności i oszczędności pamięci w porównaniu do standardowego HashMap<K, V>.

Najczęściej używane to:

  • SparseIntArray: przechowuje pary kluczy int i wartości int.
  • SparseLongArray: przechowuje pary kluczy int i wartości long.
  • SparseBooleanArray: przechowuje pary kluczy int i wartości boolean.
  • LongSparseArray<E>: przechowuje pary kluczy long i obiektów typu E.

Zalety korzystania z tych klas:

  • Efektywność pamięci: używają wewnętrznych tablic do przechowywania danych, unikając kosztów związanych z tworzeniem obiektów opakowujących dla typów prymitywnych (Integer, Long, Boolean) oraz struktury listy powiązanej HashMap.
  • Wydajność: operacje wstawiania, pobierania i usuwania są zwykle szybsze, szczególnie przy dużej liczbie elementów, dzięki prostszej strukturze wewnętrznej i unikaniu haszowania dla kluczy prymitywnych w przypadku SparseArray.

Przykład użycia SparseIntArray:

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

// Dodawanie elementów
sparseArray.put(0, 100);
sparseArray.put(1, 200);
sparseArray.put(10, 300);

// Pobieranie wartości po kluczu
int value = sparseArray.get(1); // wartość będzie 200

// Pobieranie wartości po kluczu z domyślną wartością
int valueWithDefault = sparseArray.get(5, -1); // wartość będzie -1

// Usuwanie elementu po kluczu
sparseArray.delete(10);

// Iteracja po elementach
for (int i = 0; i < sparseArray.size(); i++) {
    int key = sparseArray.keyAt(i);
    int val = sparseArray.valueAt(i);
    // Logika obsługi key i val
}

Podobnie używa się SparseLongArray, SparseBooleanArray i LongSparseArray. LongSparseArray wymaga określenia typu obiektu, ponieważ jego wartościami są obiekty, a nie typy prymitywne.

Wybór między standardowym HashMap a specjalistycznymi mapami Sparse zależy od wymagań:

  • Jeśli klucze są dowolnymi obiektami lub typami prymitywnymi innymi niż int lub long, użyj HashMap.
  • Jeśli klucze to int lub long, a wartości to typy prymitywne lub obiekty w przypadku LongSparseArray, i zależy Ci na efektywności pamięci i wydajności, lepszym wyborem są mapy Sparse.

Ważne jest, aby pamiętać, że mapy Sparse nie są bezpieczne wątkowo. Jeśli potrzebujesz implementacji bezpiecznej dla wątków, rozważ użycie ConcurrentHashMap z obiektami opakowującymi dla prymitywów. Jednak w większości przypadków, w wątku interfejsu użytkownika aplikacji Android, gdzie często używa się tych struktur, bezpieczeństwo wątków nie jest problemem.