Android
Wie verwende ich SparseArray?
Suche…
Einführung
Ein SparseArray
ist eine Alternative für eine Map
. Eine Map
erfordert, dass ihre Schlüssel Objekte sind. Das Phänomen des Autoboxings tritt auf, wenn wir einen primitiven int
Wert als Schlüssel verwenden wollen. Der Compiler konvertiert primitive Werte automatisch in ihre geschachtelten Typen (z. B. int
in Integer
). Der Unterschied beim Speicherbedarf ist spürbar: int
verwendet 4 Byte, Integer
16 Byte. Ein SparseArray
verwendet int
als Schlüsselwert.
Bemerkungen
Vorteil :
- Weniger Speicherbedarf (aufgrund der primitiven Schlüssel).
- Kein Auto-Boxen.
Nachteil:
- SparseArray verwendet die binäre Suche nach dem Suchwert (O (log n)). Daher ist es möglicherweise nicht die beste Lösung, wenn mit einer großen Anzahl von Elementen gearbeitet werden muss (verwenden Sie HashMap).
Es gibt verschiedene Varianten der Familie: -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <Integer, Integer> -SparseLongArray <Integer, Long> -LongSparseArray <Long, Object> -LongSparseLongArray <Long, Long >
SparseArray-Operationen
Element hinzufügen - put (int, x): Fügt dem angegebenen Wert eine Zuordnung vom angegebenen Schlüssel hinzu, wobei die vorherige Zuordnung vom angegebenen Schlüssel ersetzt wird, falls vorhanden. - append (int, x): Fügt ein Schlüssel / Wert-Paar in das Array ein und optimiert für den Fall, dass der Schlüssel größer ist als alle vorhandenen Schlüssel im Array. Bei sequentiellen Schlüsseln sollten Sie append () verwenden, um die Leistung zu optimieren. Ansonsten ist put () in Ordnung.
Element entfernen - delete (int): Entfernt die Zuordnung aus dem angegebenen Schlüssel, falls vorhanden. - removeAt (int): Entfernt die Zuordnung am angegebenen Index. - removeAtRange (int, int): Entfernt einen Zuordnungsbereich als Stapel.
Zugriff auf Element - get (int): Ruft das vom angegebenen Schlüssel zugeordnete int oder 0 ab, wenn keine solche Zuordnung vorgenommen wurde. - get (int, E): Ruft das vom angegebenen Schlüssel zugeordnete int oder den angegebenen Wert ab, wenn keine solche Zuordnung vorgenommen wurde. - valueAt (int): Gibt einen Index im Bereich 0 ... size () - 1 zurück, gibt den Wert aus der indexten Schlüsselwertzuordnung zurück, die dieser SparseIntArray speichert. Indizes werden aufsteigend sortiert.
index / key search - keyAt (int): Gibt einen Index im Bereich 0 ... size () - 1 zurück, gibt er den Schlüssel aus der indexten Schlüsselwertzuordnung zurück, die dieser SparseIntArray speichert. Indizes werden aufsteigend sortiert. - valueAt (int): Gibt einen Index im Bereich 0 ... size () - 1 zurück, gibt den Wert aus der indexten Schlüsselwertzuordnung zurück, die dieser SparseIntArray speichert. Indizes werden aufsteigend sortiert. - indexOfKey (int): Gibt den Index zurück, für den keyAt (int) den angegebenen Schlüssel zurückgeben würde, oder eine negative Zahl, wenn der angegebene Schlüssel nicht zugeordnet ist. - indexOfValue (E): Gibt einen Index zurück, für den valueAt (int) den angegebenen Schlüssel zurückgeben würde, oder eine negative Zahl, wenn dem angegebenen Wert keine Schlüssel zugeordnet sind. Beachten Sie, dass dies eine lineare Suche ist, im Gegensatz zu Suchvorgängen nach Schlüsseln, und dass mehrere Schlüssel auf denselben Wert abgebildet werden können. Dadurch wird nur einer von ihnen gefunden. Der Unterschied im Speicherbedarf ist auffällig: Das int verwendet 4 Bytes, die Integer verwendet 16 Bytes. ParseArray verwendet int als Schlüsselwert.
Ein einfaches Beispiel mit 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);