Collection
30.04.2024 | https://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)
- Разница между ArrayMap и HashMap?
ArrayMap
более эффективен по памяти и скорости для небольших наборов данных, используя массивы, тогда какHashMap
оптимизирован для быстрого поиска и вставки, но требует больше памяти.
- Разница между ArraySet и HashSet?
ArraySet
более эффективен по памяти и скорости для небольших наборов данных, используя массивы для хранения элементов.HashSet
, в свою очередь, оптимизирован для быстрого поиска и вставки, но занимает больше памяти и лучше подходит для больших наборов данных.