Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Класс ArrayMap из библиотеки совместимости (есть и обычная версия) является более эффективным аналогом класса HashMap и работает по принципу "ключ-значение"
ArrayMap содержит два маленьких массива вместо одного как в HashMap. Первый массив содержит хэши заданных ключей в отсортированном порядке. Второй массив хранит ключи и значения объектов в соответствии с первым массивом.
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 не является частью 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:
HashMap | Array 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, "Барсик");