2012-09-15 6 views
30

Я реализует кэш Bitmap с использованием HashMap<Integer, Bitmap> и получил следующее предупреждение в Затмении:разрежённых массив, проверьте, если ключ существует

Использовать новый разрежённый массив (...), а не для повышения производительности.

Я никогда не слышал этот класс раньше, но осматривая его это, кажется, не имеет containsKey() метод, который я призывающее извлечение растрового изображения из кэша, чтобы проверить, если он существует в кэше, и если это не так, добавьте его.

Любые идеи по наилучшему способу проверить, существует ли ключ уже существует?

Я предполагаю, что могу изменить код, чтобы использовать эту перегрузку и проверить значение null?

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

ответ

39

Вы могли бы использовать:

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

Но понимаю, что это то же самое, как get(key):

Bitmap bitmap = cache.get(key); 

Лучший способ использовать get(key, default), чтобы обеспечить общий случай по умолчанию, то является действительной заменой, когда ключ не найден.

Но нет веской причины не использовать if(get(key) != null) в качестве быстрой замены для .

+0

Спасибо Сэму, хорошее место в перегрузке, я пошел с вашим предложением просто заменить с if (get (key)! = Null). – magritte

1

documentation.

SparseArrays map integers to Objects. В отличие от обычного массива объектов, в индексах могут быть пробелы. Он должен быть более эффективным, чем использование HashMap для сопоставления целых чисел с объектами.

Вы можете использовать get(int), который также возвращает null, если ключ не найден. Подобно;

Bitmap bitmap = cache.get (key);

+0

Ключ может иметь нулевое значение, в этом случае с кодом вы не сможете определить, существует ли ключ или нет. то есть, если ключ не существует, он вернет значение null, и если ключ имеет нулевое значение, он также вернет значение null. indexOfKey должен быть пользователем в этом случае (см. ответ Alex) – user1991679

+0

@ user1991679 довольно старый ответ, и то, что вы предлагаете, я предполагаю через новую apis. Однако ответ на ваш комментарий: int primitive не может быть null. – auselen

+0

Я не понимаю, как тот факт, что примитив не может быть нулевым, связан с моим комментарием. BTW, indexOfKey был введен в API 1. – user1991679

26

Следовательно, ваше значение может быть пустым в различных ситуациях, я бы предложил использовать indexOfKey(int key) Вот ссылка indexOfKey(int key).

Тогда просто проверить отрицательное значение обратного

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

Это лучше/хуже, чем просто использовать '.get'? – Smar

1

Идущий по реализации разрежённый массив, кажется нелогичным, что он может иметь более высокую производительность (время сложности), чем HashMap (кроме нижнего пространства-требования что имеет смысл для мобильной среды), поскольку элемент get() SparseArray использует двоичный поиск (O (log N)), тогда как для HashMap используется индексирование массивов (O (1)).

Обеспечение реализации метода Get() для обоих классов (как есть):

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]; 
    } 
} 

, чтобы использовать ли indexOfKey (ключ) < 0 или получить (ключ) == NULL для проверки существования ключа в SparseArray, все нормально, поскольку оба используют двоичный поиск под ним.

public int indexOfKey(int key) { // for SparseArray 
    if (mGarbage) { 
     gc(); 
    } 

    return binarySearch(mKeys, 0, mSize, key); 
} 
+1

Я не могу понять, где соединение из вашего ответа на вопросы. –

 Смежные вопросы

  • Нет связанных вопросов^_^