Android
SparseArrayの使い方
サーチ…
前書き
SparseArray
はMap
代替です。 Map
はそのキーがオブジェクトであることを必要とします。自動ボクシングの現象は、プリミティブなint
値をキーとして使用する場合に発生します。コンパイラは、プリミティブ値をボックス化された型に自動的に変換します( int
からInteger
)。メモリフットプリントの違いは目立つint
は4バイト、 Integer
は16バイトを使用する。 SparseArray
はint
をキー値として使用します。
備考
利点:
- メモリ使用量が少ない(プリミティブキーのため)
- オートボクシングはありません。
不利益 :
- SparseArrayは検索値(O(log n))にバイナリ検索を使用するため、多数の要素(HashMapを使用)で作業する必要がある場合、最適解にならない場合があります。
-SparseArray <Integer、Long> -LongSparseArray <Long、Object> -LongSparseLongArray <Long、Long>このようなファミリには、次のような種類があります。 >
SparseArray操作
要素の追加 - put(int、x):指定されたキーから指定された値へのマッピングを追加し、指定されたキーからの以前のマッピングを置き換えます。 - append(int、x):キー/値のペアを配列に挿入し、キーが配列内の既存のキーよりも大きい場合に最適化します。パフォーマンスを最適化するには、順次キーの場合はappend()を使用する必要があります。それ以外の場合はput()は問題ありません。
remove element - delete(int):指定されたキーがある場合は、そのキーからマッピングを削除します。 removeAt(int):指定されたインデックスのマッピングを削除します。 removeAtRange(int、int):一連のマッピングをバッチとして削除します。
アクセスしている要素 - get(int):指定されたキーからマッピングされたintを取得します。マッピングが行われていない場合は0を返します。 - get(int、E):指定されたキーからマッピングされたintまたはそのようなマッピングが作成されていない場合は指定された値を取得します。 valueAt(int):0 ... size() - 1の範囲にあるインデックスを指定すると、このSparseIntArrayが格納するindex_key-valueマッピングの値を返します。インデックスは昇順に並べられます。
index / key search - keyAt(int):0 ... size() - 1の範囲のインデックスを指定すると、このSparseIntArrayが格納するインデックスキーと値のマッピングからキーを返します。インデックスは昇順に並べられます。 valueAt(int):0 ... size() - 1の範囲にあるインデックスを指定すると、このSparseIntArrayが格納するindex_key-valueマッピングの値を返します。インデックスは昇順に並べられます。 - indexOfKey(int):keyAt(int)が指定されたキーを返すインデックスを返します。指定されたキーがマップされていない場合は負の数を返します。 - indexOfValue(E):valueAt(int)が指定されたキーを返すインデックスを返します。キーが指定された値にマップされていない場合は負の数を返します。これは、キーによるルックアップとは異なり、線形検索であり、複数のキーを同じ値にマップすることができ、そのうちの1つだけを見つけることに注意してください。メモリの占有量の違いは目立つ:intは4バイトを使用し、Integerは16バイトを使用します.parseArrayはintをキー値として使用します。
SparseArrayを使用した基本的な例
class Person {
String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
final Person steve = new Person("Steve");
Person[] persons = new Person[] { new Person("John"), new Person("Gwen"), steve, new Person("Rob") };
int[] identifiers = new int[] {1234, 2345, 3456, 4567};
final SparseArray<Person> demo = new SparseArray<>();
// Mapping persons to identifiers.
for (int i = 0; i < persons.length; i++) {
demo.put(identifiers[i], persons[i]);
}
// Find the person with identifier 1234.
Person id1234 = demo.get(1234); // Returns John.
// Find the person with identifier 6410.
Person id6410 = demo.get(6410); // Returns null.
// Find the 3rd person.
Person third = demo.valueAt(3); // Returns Rob.
// Find the 42th person.
//Person fortysecond = demo.valueAt(42); // Throws ArrayIndexOutOfBoundsException.
// Remove the last person.
demo.removeAt(demo.size() - 1); // Rob removed.
// Remove the person with identifier 1234.
demo.delete(1234); // John removed.
// Find the index of Steve.
int indexOfSteve = demo.indexOfValue(steve);
// Find the identifier of Steve.
int identifierOfSteve = demo.keyAt(indexOfSteve);