TGViewer
Android under the hood Android under the hood @android_under_the_hood · 1.53K subscribers
Post #26 824
Немного о структуре данных SparseArray.

В 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)
    }

}


Пишите в комментах ваше мнение и всем хорошего кода!
  • ❤ 4
  • 🔥 4
More from @android_under_the_hood
  1. Oct 4, 2026Всем привет, хочу поделиться проектом, который запустил 1 октября — ЗдесьЯ. Это цифровая с…
  2. Oct 2, 2026Kotlin lambdas, часть I. До версии Kotlin 2.0 лямбды компилировались в анонимные классы, р…
  3. Sep 27, 2026Делегат свойства в Kotlin. В Kotlin есть конструкция, которой нет в JVM: var name by NameD…
  4. Sep 23, 2026val vs var под капотом. На уровне Kotlin все просто: val x = 10 var y = 20 y = 30 // компи…
  5. Sep 20, 2026Возвращение Прошло уже полгода с последней записи на канале. За это время в моей жизни про…
  6. Feb 5, 2026Пару фактов о Go, часть II. 4) Вместо Kotlin Nullability указатели как в С/C++, то есть об…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →