SparseLongArray Class
Android4.3(API revel 18)から SparseLongArray というクラスが追加されていました。
API reference は以下にあります。
http://developer.android.com/reference/android/util/SparseLongArray.html
ソースコードは以下にあります。(Developer Collaboration Projectを運営されている皆様、いつも利用させて頂きありがとうございます)
クラスの実装内容
ソースコードを見てみると、以下のようなクラスの定義になっています。19行目の import を見ると、ArrayUtilsのメソッドを利用しているようなので POJO ではないようです。
import com.android.internal.util.ArrayUtils;
public class SparseLongArray implements Cloneable { private int[] mKeys; private long[] mValues; private int mSize;
このクラスは、int をキーとし、Long を Value とする map のようです。 key に int を利用することによって高速なvalueの取得を実現するためのもののようです。
そのkeyの検索を実現しているのが以下のbinarySearchメソッドです。
private static int binarySearch(int[] a, int start, int len, long key) { int high = start + len, low = start - 1, guess; while (high - low > 1) { guess = (high + low) / 2; if (a[guess] < key) low = guess; else high = guess; } if (high == start + len) return ~(start + len); else if (a[high] == key) return high; else return ~high; }
このクラスは以下のモジュールで利用されています。
- AccessibilityNodeInfoCache.java
- AccessibilityNodeInfo.java
- AccessibilityInteractionClient.java
- StorageMeasurement.java
- AccessibilityInteractionController.java
ざっとみたところ、数値データの保存用のBinaryHashMapに利用されているようです。簡単な作りになっていますが、ふとこれってスレッドセーフになっているのかしら?と疑問が湧きました。以上。
#LongSparseLongArray.java というクラスも @hide ながら追加されいたりします。