41

を使用してビットマップキャッシュを実装していHashMap<Integer, Bitmap>ましたが、Eclipseで次の警告を受け取りました。

パフォーマンスを向上させるために、代わりに新しいSparseArray(...)を使用してください。

そのクラスのことは聞いたことがありませんが、調べてみるとcontainsKey()、キャッシュからビットマップを取得してキャッシュに存在するかどうかを確認するために呼び出していたメソッドがないようです。存在しない場合は、次にそれを追加します。

キーがすでに存在するかどうかを確認するための最良の方法に関するアイデアはありますか?

このオーバーロードを使用してnullをチェックするようにコードを変更できると思いますか?

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

5 に答える 5

48

あなたが使用することができます:

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

ただし、これは次と同じであることを理解してget(key)ください。

Bitmap bitmap = cache.get(key); 

使用する最良の方法get(key, default)は、一般的なデフォルトのケースを提供することです。キーが見つからない場合は、toが有効な代替となります。

if(get(key) != null)ただし、のクイック代替として使用しない理由はありませんcontains()

于 2012-09-15T22:33:42.843 に答える
32

したがって、さまざまな状況で値が null になる可能性があります。indexOfKey(int key) ここでは、indexOfKey(int key)リファレンスを使用することをお勧めします。

次に、負の戻り値をチェックするだけです

if(mySparseArray.indexOfKey(int) < 0) {
   //Item does not exist. Do something relevant 
}
于 2013-11-22T13:38:09.920 に答える
1

ドキュメントからの引用。

SparseArraysは整数をオブジェクトにマップします。オブジェクトの通常の配列とは異なり、インデックスにギャップがある可能性があります。これは、HashMapを使用して整数をオブジェクトにマップするよりも効率的であることを目的としています。

get(int)を使用できます。これは、キーが見つからない場合にもnullを返します。好き;

ビットマップビットマップ=cache.get(key);

于 2012-09-15T22:31:43.057 に答える
1

SparseArray の実装を見ると、SparseArray の get() メンバーが binary-検索 (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];
    }
}

SparseArray 内のキーの存在を確認するために indexOfKey(key) < 0 または get(key) == null を使用するかどうかについては、どちらも下でバイナリ検索を使用するため、何でも構いません。

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

    return binarySearch(mKeys, 0, mSize, key);
}
于 2016-03-21T07:59:10.380 に答える