Android
SparseArray를 사용하는 방법
수색…
소개
SparseArray
A에 대한 대안입니다 Map
. Map
은 키가 객체가되어야합니다. autoboxing 현상은 원시 int
값을 키로 사용하고자 할 때 발생합니다. 컴파일러는 원시 값을 박스형 (예 : int
에서 Integer
)으로 자동 변환합니다. 메모리 사용 공간의 차이는 눈에 띄게 나타납니다. int
는 4 바이트를 사용하고, Integer
는 16 바이트를 사용합니다. SparseArray
는 int
를 키 값으로 사용합니다.
비고
장점 :
- 적은 메모리 사용량 (기본 키 때문에).
- 자동 권투가 없습니다.
단점 :
- SparseArray는 값 (O (log n))을 찾는 데 이진 검색을 사용하므로 많은 수의 요소 (HashMap 사용)를 사용해야하는 경우 최적의 솔루션이 아닐 수도 있습니다.
-SparseArray <Integer, Long> -LongSparseArray <Long, Object> -LongSparseLongArray <Long, Long) -SparseArray <Integer, Object> -SparseBooleanArray <Integer, Boolean> -SparseIntArray <정수, 정수> -SparseLongArray <정수, Long> >
SparseArray 작업
요소의 추가 - put (int, x) : 지정된 키로부터 지정된 값에의 매핑을 추가합니다. - append (int, x) : 키 / 값 쌍을 배열에 넣고 키가 배열의 기존 키보다 큰 경우 최적화합니다. 성능을 최적화하려면 순차 키의 경우 append ()를 사용해야합니다. 그렇지 않으면 put ()이 좋습니다.
요소 삭제 - delete (int) : 지정된 키에서 매핑을 제거합니다 (있는 경우). removeAt (int) : 지정된 인덱스의 매핑을 삭제합니다. removeAtRange (int, int) : 배치의 범위를 삭제합니다.
요소를 액세스 할 때 - get (int) : 지정된 키에서 매핑 된 int를 가져 오거나 이러한 매핑이없는 경우 0을 가져옵니다. get (int, E) : 지정된 키로부터 맵 된 int를 가져옵니다. 그러한 매핑이없는 경우는 지정된 값을 가져옵니다. valueAt (int) : 0 ... size () - 1 범위의 인덱스가 지정된 경우이 SparseIntArray가 저장하는 인덱스 키 - 값 매핑의 값을 반환합니다. 색인은 오름차순으로 정렬됩니다.
index / key search - keyAt (int) : 0 ... size () - 1 범위의 인덱스가 지정된 경우이 SparseIntArray가 저장하는 인덱스 키 - 값 매핑의 키를 반환합니다. 색인은 오름차순으로 정렬됩니다. valueAt (int) : 0 ... size () - 1 범위의 인덱스가 지정된 경우이 SparseIntArray가 저장하는 인덱스 키 - 값 매핑의 값을 반환합니다. 색인은 오름차순으로 정렬됩니다. indexOfKey (int) : keyAt (int)가 지정된 키를 반환 할 색인을 반환하거나 지정된 키가 매핑되지 않은 경우 음수를 반환합니다. - indexOfValue (E) : valueAt (int)가 지정된 키를 반환하는 인덱스를 반환하거나 키가 지정된 값에 매핑되지 않은 경우 음수를 반환합니다. 이것은 키에 의한 룩업과는 달리 선형 검색이며 여러 키가 동일한 값으로 매핑 될 수 있으며이 중 하나만 찾을 수 있음을 유의하십시오. 메모리 풋 프린트의 차이는 눈에 띄게 나타납니다. 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);