LongSparseArray

たとえば、特定の機能を高速化するために、あるテーブルのクエリ結果をキャッシュしたいとする。

無為にクエリ結果をキャッシュするのは避けるべき。
キャッシュすると、データベースのACID特性が損なわれ、ヒープを大量に消費する。


こういうとき、HashMapがまず頭に浮かぶ。それも悪くない方法だけど、AndroidではKeyを固定することによって高速化を実現したSparseArrayが提供されている。

class Key Value
SparseArray int Object
SparseBooleanArray int boolean
SparseIntArray int int


と こ ろ が 、Androidの提供するデータベース(SQLite)の_IDはlong型、SparseArrayのキーはint型。結局、SparseArrayは使えない。

存在を知ったときに期待しただけ、使えないと知った時の落胆は大きかった。

解決

キーがlong型のSparseArrayが提供されている。公開はAPI Level 16 (4.2)から。もちろんsupport.v4ライブラリに含まれている。

class Key Value
LongSparseArray long Object


HashMap同様、LongSpaseArrayのコンストラクタにもinitialCapacityを指定できる。

パフォーマンス向上を期待して使うわけだから、適切な値を設定すること。

参考

HashMapとSparseArrayの性能比較を検証した記事。すごく役に立ちます。