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 kluczyinti wartościint.SparseLongArray: przechowuje pary kluczyinti wartościlong.SparseBooleanArray: przechowuje pary kluczyinti wartościboolean.LongSparseArray<E>: przechowuje pary kluczylongi obiektów typuE.
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ązanejHashMap. - 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ż
intlublong, użyjHashMap. - Jeśli klucze to
intlublong, a wartości to typy prymitywne lub obiekty w przypadkuLongSparseArray, 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.