sparsearray ejemplo java android hashmap sparse-array

java - ejemplo - SparseArray, compruebe si la clave existe



hashmap android ejemplo (4)

Estaba implementando un caché de Bitmap usando un HashMap<Integer, Bitmap> y recibí la siguiente advertencia en Eclipse:

Utilice el nuevo SparseArray (...) en su lugar para un mejor rendimiento.

Nunca antes había oído hablar de esa clase, pero al inspeccionarla no parece tener un método containsKey() que estaba llamando para recuperar un mapa de bits de la memoria caché para verificar si existe en la memoria caché, y si no lo hace ''t, luego agrégalo.

¿Alguna idea sobre la mejor manera de verificar si la clave ya existe?

¿Supongo que podría cambiar el código para usar esta sobrecarga y comprobar si no?

Bitmap bitmap = cache.get(key, null);


Citando de la documentation .

SparseArrays asigna números enteros a los objetos. A diferencia de una matriz normal de Objetos, puede haber lagunas en los índices. Se pretende que sea más eficiente que usar un HashMap para mapear enteros a objetos.

Puede usar get(key) que también devolverá null si no se encuentra la clave. Me gusta;

Bitmap bitmap = cache.get (clave);


Podrías usar:

Bitmap bitmap = cache.get(key, null);

Pero entiende que esto es lo mismo que get(key) :

Bitmap bitmap = cache.get(key);

La mejor forma de usar get(key, default) es proporcionar un caso predeterminado genérico, algo que es un sustituto válido cuando no se encuentra la clave.

Pero no hay una buena razón para no usar if(get(key) != null) como un reemplazo rápido para contains() .


Por lo tanto, su valor puede ser nulo en varias situaciones, sugiero utilizar indexOfKey(int key) Aquí está la referencia indexOfKey (clave int) .

Luego simplemente verifique el valor de retorno negativo

if(mySparseArray.indexOfKey(int) < 0) { //Item does not exist. Do something relevant }


Siguiendo la implementación de SparseArray parece contra-intuitivo que puede tener un mejor rendimiento (tiempo-complejidad) que HashMap (que no sea menor requisito de espacio que tiene sentido para un entorno móvil) ya que el miembro get () de SparseArray usa binary- búsqueda (O (log N)) mientras que para HashMap utiliza indexación de matriz (O (1)).

Proporcionando la implementación del método get () para ambas clases (tal cual):

public V get(Object key) { // for HashMap if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; } public E get(int key, E valueIfKeyNotFound) { //for SparseArray int i = binarySearch(mKeys, 0, mSize, key); if (i < 0 || mValues[i] == DELETED) { return valueIfKeyNotFound; } else { return (E) mValues[i]; } }

en cuanto a si usar indexOfKey (clave) <0 o get (clave) == null para verificar la existencia de clave en un SparseArray, todo está bien ya que ambos usan búsqueda binaria debajo.

public int indexOfKey(int key) { // for SparseArray if (mGarbage) { gc(); } return binarySearch(mKeys, 0, mSize, key); }