SparseArray 사용

SparseArray 안내
SparseArray 는 android. util 패키지 에서 int 와 대상 을 매 핑 하 는 데이터 구조 로 내부 에서 배열 을 사용 하여 이 루어 집 니 다. 각각 key 와 value 를 두 배열 에 저장 합 니 다. 자동 포장 작업 을 피 할 수 있 고 데이터 구 조 는 모든 매 핑 대상 에 의존 하지 않 기 때문에 HashMap 보다 더욱 효율 적 입 니 다.특징:
4. 567917. 1. 이분법 으로 데 이 터 를 찾 습 니 다
빅 데 이 터 를 저장 하기에 적합 하지 않다
4. 567917. 3. HashMap 보다 실행 효율 이 느 리 고 이분법 을 통 해 배열 에 삽입 하고 삭제 해 야 할 항목 을 찾 습 니 다.성능 을 향상 시 키 기 위해 SparseArray 는 삭제 할 때 항목 을 실제 삭제 하지 않 고 삭제 해 야 할 대상 을 표시 하 는 최 적 화 를 했다
API:
구조 방법:
SparseArray (): 기본 용량 10. SparseArray (int initialCapacity): 지정 용량 은 initialCapacity 입 니 다.
수치 추출 방법:
E get (int key): 키 에 해당 하 는 값 을 가 져 옵 니 다.public E get (int key, E valueIfKeyNotFound): 키 에 대응 하 는 값 을 가 져 오고, 없 으 면 주어진 valueIfKeyNotFound 를 되 돌려 줍 니 다.E valueAt (int index): 지정 한 인덱스 의 value 값 가 져 오기
키 취 하 는 방법:
int keyat (int index): 지정 한 색인 의 key 값 을 되 돌려 줍 니 다.
색인 가 져 오 는 방법:
int index OfKey (int key): 지정 한 key 의 색인 값 가 져 오기 int index OfValue (E value): 지정 한 value 의 색인 값 을 가 져 오고 value 를 사용 합 니 다.
삭제 방법:
void delete (int key): 지정 한 key 의 값 을 삭제 하고 key 가 존재 하지 않 으 면 동작 하지 않 습 니 다.void remove (int key): 내부 에서 delete () 를 호출 합 니 다. void removeAt (int index): 지정 한 색인 위치의 값 을 삭제 합 니 다.void removeAtRange(int index, int size)。index - index + size 구간 의 값 을 삭제 합 니 다.E removeReturnOld (int key): 지정 한 key 의 값 을 삭제 하고 되 돌려 줍 니 다.void clear (): SparseArray 를 비 웁 니 다.
맵 추가 방법:
void put (int key, E value): 지정 한 key 와 value 를 추가 합 니 다. key 가 존재 하면 이 key 의 value 를 이번 들 어 오 는 value 로 대체 합 니 다.void append (int key, E value): 지정 한 key 와 value 를 추가 하고 배열 의 모든 기 존 키 보다 키 가 큰 경우 에 최적화 합 니 다.
값 수정 방법:
void setValueAt (int index, E value): 지정 한 색인 위치의 value 를 교체 합 니 다.
기타 방법:
int size (): SparseArray 에 저 장 된 개 수 를 가 져 옵 니 다.SparseArray clone (): SparseArray 를 복제 하여 Cloneable 인 터 페 이 스 를 실현 합 니 다.String toString (): {key = obj} 형식 으로 문자열 을 되 돌려 줍 니 다.
내부 구현:
SparesArray 내 부 는 두 개의 데 이 터 를 사용 하여 각각 key 와 value 를 저장 합 니 다. 다음 과 같 습 니 다.
public class SparseArray<E> implements Cloneable {
    private static final Object DELETED = new Object();
    private boolean mGarbage = false;

    private int[] mKeys;
    private Object[] mValues;
    private int mSize;

맵 쌍 을 삭제 할 때 해당 값 을 삭제 하 는 것 이 아니 라 key 를 유지 하고 value 에 표 시 를 추가 합 니 다: DELETED, 이 key 를 다시 사용 할 수 있 습 니 다. 마지막 으로 쓰레기 회수 절차 에서 삭 제 됩 니 다. 예 를 들 어:
    public void delete(int key) {
        int i = ContainerHelpers.binarySearch(mKeys, mSize, key);

        if (i >= 0) {
            if (mValues[i] != DELETED) {
                mValues[i] = DELETED;
                mGarbage = true;
            }
        }
    }

쓰레기 수 거 방법 은 다음 과 같다.

private void gc() {
    // Log.e("SparseArray", "gc start with " + mSize);

    int n = mSize;
    int o = 0;
    int[] keys = mKeys;
    Object[] values = mValues;

    for (int i = 0; i < n; i++) {
        Object val = values[i];

        if (val != DELETED) {
            if (i != o) {
                keys[o] = keys[i];
                values[o] = val;
                values[i] = null;
            }

            o++;
        }
    }

    mGarbage = false;
    mSize = o;

    // Log.e("SparseArray", "gc end with " + mSize);
}

좋은 웹페이지 즐겨찾기