Android
Hur man använder SparseArray
Sök…
Introduktion
En SparseArray
är ett alternativ för en Map
. En Map
kräver att dess nycklar är objekt. Fenomenet med autoboxing inträffar när vi vill använda ett primitivt int
värde som nyckel. Kompilatorn konverterar automatiskt primitiva värden till sina boxade typer (t.ex. int
till Integer
). Skillnaden i minnesfotavtryck märks: int
använder 4 byte, Integer
använder 16 byte. En SparseArray
använder int
som nyckelvärde.
Anmärkningar
Fördel:
- Mindre minnesanvändning (på grund av de primitiva knapparna).
- Ingen automatisk boxning.
Nackdel:
- SparseArray använder binär sökning för sökvärde (O (log n)), så det kanske inte är den bästa lösningen om man måste arbeta med ett stort antal element (använd HashMap).
Det finns flera varianter av familjen: >
SparseArray-operationer
lägga till element - put (int, x): Lägger till en mappning från den angivna nyckeln till det angivna värdet och ersätter den tidigare mappningen från den angivna nyckeln om det fanns en. - bifoga (int, x): Sätter ett nyckel- / värdepar i matrisen, optimerar för det fall där nyckeln är större än alla befintliga nycklar i matrisen. Du bör använda append () vid sekvensnycklar för att optimera prestanda. Annars är det bra att sätta ().
ta bort element - ta bort (int): Tar bort mappningen från den angivna nyckeln, om det fanns något. - removeAt (int): Tar bort kartläggningen vid det givna indexet. - removeAtRange (int, int): Ta bort en rad mappningar som en batch.
åtkomstelement - get (int): Hämtar int-mappningen från den angivna nyckeln, eller 0 om ingen sådan mappning har gjorts. - get (int, E): Hämtar int-mappningen från den angivna nyckeln eller det angivna värdet om ingen sådan mappning har gjorts. - valueAt (int): Givet ett index i intervallet 0 ... storlek () - 1, returnerar värdet från den indexerade nyckelvärdekartläggningen som denna SparseIntArray lagrar. Index beställs i stigande ordning.
index / nyckelsökning - keyAt (int): Givet ett index i intervallet 0 ... storlek () - 1, returnerar nyckeln från den indexerade nyckelvärdekartläggningen som denna SparseIntArray lagrar. Index beställs i stigande ordning. - valueAt (int): Givet ett index i intervallet 0 ... storlek () - 1, returnerar värdet från den indexerade nyckelvärdekartläggningen som denna SparseIntArray lagrar. Index beställs i stigande ordning. - indexOfKey (int): Returnerar indexet för vilket keyAt (int) skulle returnera den angivna nyckeln, eller ett negativt nummer om den angivna nyckeln inte är mappad. - indexOfValue (E): Returnerar ett index för vilket värdeAt (int) skulle returnera den angivna nyckeln, eller ett negativt tal om inga nycklar kartlägger det angivna värdet. Se upp för att detta är en linjär sökning, till skillnad från sökningar efter nyckel, och att flera nycklar kan kartlägga till samma värde och det finns bara en av dem. Skillnaden i deras minnesfotavtryck märks: int använder 4 byte, heltalet använder 16 byte.SparseArray använder int som nyckelvärde.
Grundläggande exempel med 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);