SparseArray
se puede usar para reemplazar HashMap
cuando la clave es un tipo primitivo. Existen algunas variantes para diferentes tipos de clave / valor, aunque no todas están disponibles públicamente.
Los beneficios son:
- Libre de asignación
- No boxeo
Inconvenientes:
- Generalmente más lento, no indicado para grandes colecciones
- No funcionarán en un proyecto que no sea Android
HashMap
puede ser reemplazado por lo siguiente:
SparseArray <Integer, Object>
SparseBooleanArray <Integer, Boolean>
SparseIntArray <Integer, Integer>
SparseLongArray <Integer, Long>
LongSparseArray <Long, Object>
LongSparseLongArray <Long, Long> //this is not a public class
//but can be copied from Android source code
En términos de memoria, aquí hay un ejemplo de SparseIntArray
vs HashMap<Integer, Integer>
para 1000 elementos:
SparseIntArray
:
class SparseIntArray {
int[] keys;
int[] values;
int size;
}
Clase = 12 + 3 * 4 = 24 bytes
Matriz = 20 + 1000 * 4 = 4024 bytes
Total = 8,072 bytes
HashMap
:
class HashMap<K, V> {
Entry<K, V>[] table;
Entry<K, V> forNull;
int size;
int modCount;
int threshold;
Set<K> keys
Set<Entry<K, V>> entries;
Collection<V> values;
}
Clase = 12 + 8 * 4 = 48 bytes
Entrada = 32 + 16 + 16 = 64 bytes
Matriz = 20 + 1000 * 64 = 64024 bytes
Total = 64,136 bytes
Fuente: Android Memories por Romain Guy de la diapositiva 90.
Los números anteriores son la cantidad de memoria (en bytes) asignada en el montón por JVM. Pueden variar según la JVM específica utilizada.
El java.lang.instrument
paquete contiene algunos métodos útiles para operaciones avanzadas como verificar el tamaño de un objeto con getObjectSize(Object objectToSize)
.
Hay información adicional disponible en la documentación oficial de Oracle .
Clase = 12 bytes + (n variables de instancia) * 4 bytes
Matriz = 20 bytes + (n elementos) * (tamaño del elemento)
Entrada = 32 bytes + (tamaño del primer elemento) + (tamaño del segundo elemento)