보통 작업을 하다 보면, Map<Integer, Object>를 사용하게 되면, SparseArray 더욱 좋은 Performance를 가지고 있으니 바꾸라는 Lint가 뜬다.
SparseArray는 Primitive type의 키를 가질때, HashMap 으로 대체될 수 있다.
SparseArray 가 가지는 장점으로는 HashMap 과는 달리 내부에서 객체를 생성하지 않아, 더 높은 퍼포먼스를 가진다고한다. 그렇게 때문에 Wrapper 클래스로 boxing 할 필요가 없어 또한 이점을 가진다.
SparseArray의 주 목적은 객체 대신 객체를 키로 사용하여 메모리를 절약한다는 것이다.
단점으로는 안드로이드에서만 동작하기 때문에 안드로이드에 높은 의존성을 가진다.
HashMap은 아래와 같이 변환되어 사용될 수 있다.
SparseArray <Integer, Object>
SparseBooleanArray <Integer, Boolean>
SparseIntArray <Integer, Integer>
SparseLongArray <Integer, Long>
LongSparseArray <Long, Object>
LongSparseLongArray <Long, Long>
또한 메모리 관점에서 이 둘을 비교해본다면, 가령 1000개의 원소를 가지는 SparseIntArray 와 HashMap<Integer, Integer> 가 있다고 생각해보자.
SparseIntArray
:
class SparseIntArray {
int[] keys;
int[] values;
int size;
}
Class = 12 + 3 * 4 = 24 bytes
Array = 20 + 1000 * 4 = 4024 bytes
Total = 8,072 bytes
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;
}
Class = 12 + 8 * 4 = 48 bytes
Entry = 32 + 16 + 16 = 64 bytes
Array = 20 + 1000 * 64 = 64024 bytes
Total = 64,136 bytes
Class = 12 bytes + (n instance variables) * 4 bytes
Array = 20 bytes + (n elements) * (element size)
Entry = 32 bytes + (1st element size) + (2nd element size)
(오라클 도큐먼트 참고)
'Android > Development Tips' 카테고리의 다른 글
액티비티의 백스택, taskAffinity (0) | 2018.12.12 |
---|---|
안드로이드 디바이스 설정(언어설정, SIM 교체, 화면 돌림) 데이터 보존 (0) | 2018.12.12 |
xml에 백그라운드 이미지와 , 버튼 클릭효과 동시에 적용하기 (0) | 2018.11.08 |
[Android] Foreground 활용하기, 터치 이벤트 쉽게 적용하기 (0) | 2018.11.08 |
[펌] Activity 스택 intent flag (0) | 2018.07.12 |