Android How to use SparseArray

Help us to keep this website almost Ad Free! It takes only 10 seconds of your time:
> Step 1: Go view our video on YouTube: EF Core Bulk Insert
> Step 2: And Like the video. BONUS: You can also share it!

Introduction

A SparseArray is an alternative for a Map. A Map requires its keys to be objects. The phenomenon of autoboxing occurs when we want to use a primitive int value as key. The compiler automatically converts primitive values to their boxed types (e.g. int to Integer). The difference in memory footprint is noticeable: int uses 4 bytes, Integer uses 16 bytes. A SparseArray uses int as key value.

Remarks

Advantage :

  • Less memory usage(because of the primitive keys).
  • No auto-boxing.

Disadvantage :

  • SparseArray uses binary search for find value ( O(log n) ), so its may not be the best solution if have to work with large number of element(use HashMap).

There are several variants of the family like : -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <Integer, Integer> -SparseLongArray <Integer, Long> -LongSparseArray <Long, Object> -LongSparseLongArray <Long, Long>

SparseArray operations

  • adding element -- put(int, x): Adds a mapping from the specified key to the specified value, replacing the previous mapping from the specified key if there was one. -- append(int, x): Puts a key/value pair into the array, optimizing for the case where the key is greater than all existing keys in the array. You should use append() in case of sequential keys to optimize performance. Otherwise put() is fine.

  • removing element -- delete(int): Removes the mapping from the specified key, if there was any. -- removeAt(int): Removes the mapping at the given index. -- removeAtRange(int, int): Remove a range of mappings as a batch.

  • accessing element -- get(int): Gets the int mapped from the specified key, or 0 if no such mapping has been made. -- get(int, E): Gets the int mapped from the specified key, or the specified value if no such mapping has been made. -- valueAt(int): Given an index in the range 0...size()-1, returns the value from the indexth key-value mapping that this SparseIntArray stores. Indices are ordered in ascending order.

  • index/key search -- keyAt(int): Given an index in the range 0...size()-1, returns the key from the indexth key-value mapping that this SparseIntArray stores. Indices are ordered in ascending order. -- valueAt(int): Given an index in the range 0...size()-1, returns the value from the indexth key-value mapping that this SparseIntArray stores. Indices are ordered in ascending order. -- indexOfKey(int): Returns the index for which keyAt(int) would return the specified key, or a negative number if the specified key is not mapped. -- indexOfValue(E): Returns an index for which valueAt(int) would return the specified key, or a negative number if no keys map to the specified value. Beware that this is a linear search, unlike lookups by key, and that multiple keys can map to the same value and this will find only one of them. The difference in their memory footprint is noticeable: the int uses 4 bytes, the Integer uses 16 bytes.SparseArray uses int as key value.



Got any Android Question?