В Android есть такая структура данных как SparseArray, это более эффективный по памяти вариант реализации HashMap'ы.
Основные особенности:
1) Использование примитивного типа в качестве ключа: SparseArray использует Int без autoboxing/unboxing механизма, что избавляет память от ненужного мусора.
2) Ключи и значения хранятся линейно двумя массивами keys и values без использования дополнительных классов, таких как Map.Entry из HashMap, что существенно уменьшает количество используемой памяти.
3) Для нахождения индекса нового значения используется бинарный поиск, который значительно медленнее хэш функции, но это не означает что SparseArray можно использовать только для небольшого количества элементов, всё зависит от баланса: память / скорость, если выбирать первое, то разумеется SparseArray, если второе то HashMap, но в этом случае стоит помнить про коллизии, вероятность которых увеличивается при большем количестве элементов.
4) При удалении значений остаются пустые места в массивах и со временем таких пустот может образоваться очень много, поэтому в SparseArray, как и в ArrayList, элементы массивов сдвигаются.
5) Также существуют SparseIntArray, SparseLongArray и SparseBooleanArray для случаев, когда значения являются примитивами Int, Long и Boolean соответственно, ключ также остаётся типа Int
6) Пример использования SparseArray:
class MemoryIDIdentityCache {
private val cache = SparseArray<Any>()
fun save(@IdRes key: Int, value: Any) {
cache[key] = value
}
fun <T> read(@IdRes key: Int): T? {
return cache[key] as? T
}
fun remove(@IdRes key: Int) {
cache.remove(key)
}
}Пишите в комментах ваше мнение и всем хорошего кода!
