Collection

https://developer.android.com/reference/androidx/collection/package-summary
https://developer.android.com/reference/androidx/collection/ArrayMap
https://developer.android.com/reference/androidx/collection/ArraySet
https://developer.android.com/reference/androidx/collection/ScatterMap
https://developer.android.com/reference/androidx/collection/ObjectFloatMap
https://developer.android.com/reference/androidx/collection/IntIntPair
https://developer.android.com/reference/androidx/collection/FloatFloatPair
https://developer.android.com/reference/androidx/collection/LongLongPair
30.04.2024https://habr.com/ru/articles/811415/
ArrayMap

Оптимизированный аналог HashMap для небольших коллекций. Экономит память и сохраняет порядок вставки, но менее эффективен на больших данных.

val arrayMap: ArrayMap<Int, String> = arrayMapOf(1 to "Tom", 2 to "Sam", 3 to "Bob")
ArraySet

Оптимизированный аналог HashSet в Android. Он экономит память, не используя хэш-таблицы, и подходит для небольших коллекций.

val arraySet: ArraySet<String> = arraySetOf("Tom", "Sam", "Bob")
ScatterMap

Эффективнее использует память чем стандартный HashMap. Реализация LinkedHashMap не оптимизирована для памяти поскольку каждая запись вставленная в карту создает новый LinkedHashMapEntry экземпляр (это также верно для базового HashMap класса и его HashMap.Node).

• Накладные расходы на каждую запись составляют 1 байт.

• Вставка не требует выделения памяти если карте не требуется увеличить внутреннее хранилище.

• Итерация не требует выделения.

val scatterMap: MutableScatterMap<Int, String> = mutableScatterMapOf()
scatterMap[0] = "John"
ObjectFloatMap

Реализация Map с ключами Object и значениями Float. Позволяет избежать выделения памяти при операциях.

val objectFloatMap: MutableObjectFloatMap<String> = mutableObjectFloatMapOf()
objectFloatMap.put("key1", 0F)
IntIntPair

Хранит два значения типа Int в виде одного числа Long благодаря простейшей битовой математики: первое число хранится в старших 32 битах Long а второе в младших. Является value-классом.

val intIntPair = IntIntPair(0, 1)
val first = intIntPair.first
val second = intIntPair.second

val (firstInt, secondInt) = IntIntPair(0, 1)
FloatFloatPair

Аналогично IntIntPair хранит два значения типа Float в одном значении типа Long отличие заключается только в дополнительной трансформации числа Float в битовое представление типа Int.

val floatFloatPair = FloatFloatPair(0F, 1F)
val first = floatFloatPair.first
val second = floatFloatPair.second

val (firstFloat, secondFloat) = FloatFloatPair(0F, 1F)
LongLongPair

Простейшая реализация для двух чисел типа Long. Выигрывает перед Pair<Long, Long> в памяти, так как для всех обобщенных типов используются классы обертки, а не примитивные типы.

val longLongPair = LongLongPair(0L, 1L)
val first = longLongPair.first
val second = longLongPair.second

val (firstLong, secondLong) = LongLongPair(0L, 1L)
Вопросы на собесе (2)
  1. Разница между ArrayMap и HashMap?

    ArrayMap более эффективен по памяти и скорости для небольших наборов данных, используя массивы, тогда как HashMap оптимизирован для быстрого поиска и вставки, но требует больше памяти.

  1. Разница между ArraySet и HashSet?

    ArraySet более эффективен по памяти и скорости для небольших наборов данных, используя массивы для хранения элементов. HashSet, в свою очередь, оптимизирован для быстрого поиска и вставки, но занимает больше памяти и лучше подходит для больших наборов данных.