2012/02/28

SparseArrayメモ

ADT17が間もなくリリースされるそうですが、Lint先生にパフォーマンスに関する項目が追加になるそう。
Floatでjava.lang.Mathの各メソッド使うのは無駄だからandroid.util.FloatMath使えとか、Map<Integer, E>は無駄だからSparseArray使えとか。

私自身FloatMathは知っていたけれどSparseArrayはListViewのマルチチョイスモードで選択位置の取得の返り値がSparseBooleanArrayってことくらいしか知らなかったので、SparseArrayについてのメモ。
注)大分適当です


Q. SparseArrayって何?
A. キーがintでListっぽくもMapっぽくも使える何か。

Q. どう使うの?
A. Map<Integer, E>をそのままSparseArrayに書き換えればおk。

Q. キー一覧や値一覧ってどうやって取得するの?
A. forループやwhileで回して頑張れ。


値がBooleanやIntegerの場合にはSparseBooleanArrayやSparseIntegerArrayが実装されているのでそっちを使おう。
あんまりJavaの内部のことを知らないのでintとIntegerがどれくらい違うのかが分からないのだけれど、Androidで利用する分にはパフォーマンスが上がるのでしょう。


SparseArrayは内部で
private int[] mKeys;
private Object[] mValues;
private int mSize;
を管理していて、SparseArray#putで中身を突っ込むとキーと値がそれぞれに格納される。Parcelに突っ込むときはParcel#writeSparseArrayってメソッドがあるのでそれを使うか、sizeとkey、valueをループ回して突っ込もう(Parcel#writeSpaseArrayの中身はループ回してるだけなので)。逆もしかり。


###
SparseArrayは日本語に訳すと疎な配列。それぞれの値に関連性が薄いんでしょう。