Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

ArrayMap и SparseArray

ArrayMap

Класс ArrayMap из библиотеки совместимости (есть и обычная версия) является более эффективным аналогом класса HashMap и работает по принципу "ключ-значение"

ArrayMap содержит два маленьких массива вместо одного как в HashMap. Первый массив содержит хэши заданных ключей в отсортированном порядке. Второй массив хранит ключи и значения объектов в соответствии с первым массивом.

ArrayMap


ArrayMap<String, String> arrayMap = new ArrayMap<>();
arrayMap.put("Кот", "Васька");
arrayMap.put("Пёс", "Барбос");
String value = arrayMap.get("Кот");

mInfoTextView.setText(value);

В отличие от HashMap с помощью ArrayMap можно сделать проход в цикле по индексу.


ArrayMap<String, String> arrayMap = new ArrayMap<>();
arrayMap.put("Кот", "Васька");
arrayMap.put("Пёс", "Барбос");
arrayMap.put("Ворона", "Карлуша");

for (int i = 0; i < arrayMap.size(); i++) {
    String key = arrayMap.keyAt(i);
    Log.i("TAG", key);
    String value = arrayMap.valueAt(i);
    Log.i("TAG", value);
}

Если у вас не слишком много объектов (до 1000) и операции вставки не слишком часты, то ArrayMap - ваш выбор.

SparseArray

Класс SparseArray не является частью Java, а является альтернативой классу Map и его производным. Главное отличие от ArrayMap заключается в том, что у Sparse-классов в качестве ключа всегда выступают примитиные типы. В остальном принцип работы схож.

При работе с коллекциями Map мы используем объект Integer в качестве ключа. И этот объект постоянно используется при операциях put(), get() и т.д. Подобный подход влияет на потребление памяти.

Класс SparseArray лишён этого недостатка. Если у вас есть Java-код, который вы решили портировать на Android, то не забывайте про этот класс. Причём, адаптировать код очень просто.


SparseArray array = new SparseArray();
array.put(0, "example object");
String value = array.get(0);
array.remove(0);

Класс появился ещё в API 1, но был переработан в API 11. Обновленная версия SparseArrayCompat также доступна для старых устройств в библиотеке совместимости.

Имеется несколько других типов SparseArray:

  • LongSparseArray - добавлен в API 16, есть в библиотеке поддержки.
  • SparseIntArray - доступен в API 1.
  • SparseBooleanArray - доступен в API 1.
HashMapArray class
HashMap<K,V>ArrayMap<K,V>
HashMap<Integer, Object>SparseArray<Object>
HashMap<Integer, Boolean>SparseBooleanArray
HashMap<Integer, Integer>SparseIntArray
HashMap<Integer, Long>SparseLongArray
HashMap<Long, Object>LongSparseArray<Object>

SparseArray sparseArray = new SparseArray();
sparseArray.put(1, "Мурзик");

SparseLongArray sparseLongArray = new SparseLongArray();
sparseLongArray.put(1, 1L);

SparseBooleanArray sparseBooleanArray = new SparseBooleanArray();
sparseBooleanArray.put(1, true);

SparseIntArray sparseIntArray = new SparseIntArray();
sparseIntArray.put(1, 2);

LongSparseArray longSparseArray = new LongSparseArray();
longSparseArray.put(1L, "Барсик");
Реклама