_HashMap<Integer, Bitmap>
_を使用してビットマップキャッシュを実装していて、Eclipseで次の警告を受け取りました。
パフォーマンスを向上させるには、代わりに新しいSparseArray(...)を使用してください。
以前にそのクラスについて聞いたことがありませんが、それを検査すると、キャッシュからビットマップを取得してキャッシュに存在するかどうかを確認するときに呼び出すcontainsKey()
メソッドがないようです。そうでない場合は、追加します。
キーがすでに存在するかどうかを確認する最良の方法についてのアイデアはありますか?
このオーバーロードを使用してnullをチェックするようにコードを変更できると思いますか?
_Bitmap bitmap = cache.get(key, null);
_
あなたは使うことができます:
_Bitmap bitmap = cache.get(key, null);
_
ただし、これは get(key)
と同じであることを理解してください。
_Bitmap bitmap = cache.get(key);
_
get(key, default)
を使用する最良の方法は、一般的なデフォルトのケースを提供することです。キーが見つからない場合、有効な置換を使用します。
ただし、if(get(key) != null)
の代わりにcontains()
を使用しない理由はありません。
したがって、さまざまな状況で値がnullになる可能性があるので、useindexOfKey(int key)
を使用することをお勧めします indexOfKey(int key) 参照。
次に、単に負の戻り値を確認します
if(mySparseArray.indexOfKey(int) < 0) {
//Item does not exist. Do something relevant
}
SparseArrayのget()メンバーがバイナリを使用しているため、SparseArrayの実装では、HashMapよりもパフォーマンス(時間の複雑さ)が優れている(モバイル環境で意味のある低いスペース要件を除く)と直観に反するようです(O(log N))を検索し、HashMapではarray-indexing(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);
}
複数の方法:
とにかくキーに関連付けられている値を使用する場合は、get()
を使用できます。
_val sparseArray = SparseArray<String>()
val someKey = 123
val someValue: String? = sparseArray[someKey]
if(someValue!=null){
//do something
}
_
IDEが考えることとは対照的に、nullにすることができるため、_?
_を追加したのはこのためです。
存在するかどうかだけを確認したい場合は、indexOfKey(key) >= 0
を使用できます。
上記が気に入らず、より読みやすいオプションが必要な場合は、ktx-collection依存関係のcontainsKey
を使用できます。
_implementation 'androidx.core:core-ktx:#'
implementation 'androidx.collection:collection-ktx:#'
_
使用法:
_ val sparseArray = SparseArray<String>()
val someKey = 123
if (sparseArray.containsKey(someKey)) {
//do something
}
_