Android
Как использовать SparseArray
Поиск…
Вступление
SparseArray
- альтернатива для Map
. Map
требует, чтобы ее ключи были объектами. Явление автобоксинга происходит, когда мы хотим использовать в качестве ключа примитивное значение int
. Компилятор автоматически преобразует примитивные значения в свои бокс-типы (например, int
в Integer
). Разница в области памяти заметна: int
использует 4 байта, Integer
использует 16 байт. SparseArray
использует int
как ключевое значение.
замечания
Преимущество:
- Меньше использования памяти (из-за примитивных ключей).
- Нет автоматического бокса.
Недостаток :
- SparseArray использует двоичный поиск для значения find (O (log n)), поэтому его может быть не лучшим решением, если нужно работать с большим количеством элементов (используйте HashMap).
Существует несколько вариантов семейства, таких как: -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <Integer, Integer> -SparseLongArray <Integer, Long> -LongSparseArray <Long, Object> -LongSparseLongArray <Long, Long >
Операции SparseArray
добавление элемента - put (int, x): добавляет сопоставление от указанного ключа к указанному значению, заменяя предыдущее сопоставление с указанным ключом, если оно есть. - append (int, x): помещает пару ключ / значение в массив, оптимизируя для случая, когда ключ больше всех существующих ключей в массиве. Вы должны использовать append () в случае последовательных ключей для оптимизации производительности. В противном случае put () в порядке.
remove element - delete (int): Удаляет отображение из указанного ключа, если он есть. - removeAt (int): Удаляет отображение по данному индексу. - removeAtRange (int, int): удалить диапазон отображений в виде пакета.
accessing element - get (int): Получает int, отображаемый из указанного ключа, или 0, если такое отображение не было сделано. - get (int, E): Получает int, отображаемый из указанного ключа, или указанное значение, если такое отображение не было сделано. - valueAt (int): Учитывая индекс в диапазоне 0 ... size () - 1, возвращает значение из сопоставления значений ключа indexth, которое хранится в этом SparseIntArray. Индексы упорядочены в порядке возрастания.
index / key search - keyAt (int): Учитывая индекс в диапазоне 0 ... size () - 1, возвращает ключ из сопоставления значений ключа indexth, который хранится в этом SparseIntArray. Индексы упорядочены в порядке возрастания. - valueAt (int): Учитывая индекс в диапазоне 0 ... size () - 1, возвращает значение из сопоставления значений ключа indexth, которое хранится в этом SparseIntArray. Индексы упорядочены в порядке возрастания. - indexOfKey (int): возвращает индекс, для которого keyAt (int) вернет указанный ключ или отрицательное число, если указанный ключ не отображается. - indexOfValue (E): возвращает индекс, для которого valueAt (int) вернет указанный ключ или отрицательное число, если никакие клавиши не сопоставляются с указанным значением. Остерегайтесь, что это линейный поиск, в отличие от поиска по ключу, и что несколько ключей могут сопоставляться с одним и тем же значением, и это найдет только один из них. Разница в области памяти заметна: int использует 4 байта, Integer использует 16 байт. SparseArray использует int как значение ключа.
Основной пример использования SparseArray
class Person {
String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
final Person steve = new Person("Steve");
Person[] persons = new Person[] { new Person("John"), new Person("Gwen"), steve, new Person("Rob") };
int[] identifiers = new int[] {1234, 2345, 3456, 4567};
final SparseArray<Person> demo = new SparseArray<>();
// Mapping persons to identifiers.
for (int i = 0; i < persons.length; i++) {
demo.put(identifiers[i], persons[i]);
}
// Find the person with identifier 1234.
Person id1234 = demo.get(1234); // Returns John.
// Find the person with identifier 6410.
Person id6410 = demo.get(6410); // Returns null.
// Find the 3rd person.
Person third = demo.valueAt(3); // Returns Rob.
// Find the 42th person.
//Person fortysecond = demo.valueAt(42); // Throws ArrayIndexOutOfBoundsException.
// Remove the last person.
demo.removeAt(demo.size() - 1); // Rob removed.
// Remove the person with identifier 1234.
demo.delete(1234); // John removed.
// Find the index of Steve.
int indexOfSteve = demo.indexOfValue(steve);
// Find the identifier of Steve.
int identifierOfSteve = demo.keyAt(indexOfSteve);