Я хочу знать производительность и эффективность между SparseArray и HashMap и какой из них лучше использовать. я не понимаю, когда использовать SparseArray, а когда Hashmap

4
vishal patel 25 Окт 2016 в 12:38

2 ответа

Лучший ответ

SparseArray - это выбор, который вам следует сделать, когда ваш ключ карты является целым числом, и эти целые числа не являются последовательными, то есть не 0, 1, 2, 3, 4, ... n - а больше похоже на 43, 2045 , 12, 5.

Теперь давайте на мгновение предположим, что ваши ключи были целыми числами, но также последовательными (0, 1, 2, 3, 4, ... n). Какая коллекция будет лучшим выбором в этом случае? Что ж, давайте предположим, что ваши значения равны Strings. В этом случае лучшим выбором будет массив String (String[]). Причина в том, что массив String отвечает всем вашим требованиям с минимальным влиянием на производительность.

myStringArray[0] вернет значение String ключа '0' и так далее.

SparseArray работает точно так же, за исключением того, что мы позволяем некоторым значениям внутри массива быть пустыми (следовательно, «разреженными»). SparseArray создаст большой массив за кулисами и будет использовать целочисленные ключи в качестве индексов массива, в который помещаются значения.

По сути, HashMaps также работает таким образом - за кулисами существует большой целочисленный массив, который используется для размещения значений. Единственная разница в том, что в HashMaps ключи не целые числа, они могут быть любыми. Для нашего примера предположим, что ключи - Strings. HashMap будет использовать хеш-функцию для преобразования этого ключа String в целое число, а затем использовать это для размещения значения в массиве. Это может привести к случаям, когда два разных Strings производят одинаковые целые числа. В этих случаях HashMap выполнит другую операцию, такую ​​как постановка значений в очередь в массиве, создание нового ключа и т. Д. Это, а также создание целочисленного ключа с помощью хэш-функции, иногда может потребовать некоторой производительности.

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

7
Gil Moshayof 25 Окт 2016 в 09:50

В документации Android для SparseArray говорится:

  1. Обычно он медленнее, чем традиционный HashMap, поскольку поиск требуется двоичный поиск, а добавление и удаление требуют вставки и
    удаление записей в массиве.

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

Итак, вкратце; Разреженные массивы могут использоваться для замены хэш-карт, когда ключ является примитивным типом.

2
Febi M Felix 25 Окт 2016 в 09:43