SparseArray
교체하는 데 사용할 수 있습니다 HashMap
키가 기본 유형 인 경우 . 모든 키 / 값 유형이 공개되지는 않지만 여러 키 / 값 유형에 대한 변형이 있습니다.
이점은 다음과 같습니다.
단점 :
- 일반적으로 속도가 느리고 대규모 컬렉션에는 표시되지 않습니다
- Android 이외의 프로젝트에서는 작동하지 않습니다.
HashMap
다음으로 대체 할 수 있습니다.
SparseArray <Integer, Object>
SparseBooleanArray <Integer, Boolean>
SparseIntArray <Integer, Integer>
SparseLongArray <Integer, Long>
LongSparseArray <Long, Object>
LongSparseLongArray <Long, Long> //this is not a public class
//but can be copied from Android source code
메모리 측면 에서 1000 개의 요소에 대한 예제는 다음 SparseIntArray
과 HashMap<Integer, Integer>
같습니다.
SparseIntArray
:
class SparseIntArray {
int[] keys;
int[] values;
int size;
}
클래스 = 12 + 3 * 4 = 24 바이트
배열 = 20 + 1000 * 4 = 4024 바이트
총계 = 8,072 바이트
HashMap
:
class HashMap<K, V> {
Entry<K, V>[] table;
Entry<K, V> forNull;
int size;
int modCount;
int threshold;
Set<K> keys
Set<Entry<K, V>> entries;
Collection<V> values;
}
클래스 = 12 + 8 * 4 = 48 바이트
항목 = 32 + 16 + 16 = 64 바이트
배열 = 20 + 1000 * 64 = 64024 바이트
총계 = 64,136 바이트
출처 : 슬라이드 90의 Romain Guy의 Android Memories
위의 숫자는 JVM이 힙에 할당 한 메모리 양 (바이트)입니다. 사용되는 특정 JVM에 따라 다를 수 있습니다.
이 java.lang.instrument
패키지에는로 객체 크기 확인과 같은 고급 작업에 유용한 방법이 포함되어 있습니다 getObjectSize(Object objectToSize)
.
추가 정보는 공식 Oracle 문서 에서 구할 수 있습니다 .
클래스 = 12 바이트 + (n 개의 인스턴스 변수) * 4 바이트
배열 = 20 바이트 + (n 개의 요소) * (요소 크기)
항목 = 32 바이트 + (1 번째 요소 크기) + (2 번째 요소 크기)