옛글/안드로이드 프로그래밍

SparseArray가 HashMap보다 좋은이유와 사용예

ShakeJ 2013. 10. 21. 20:30
반응형

 

 이클립스에서 

Map<Integer, Object>를 사용하게 되면, SparseArray 더욱 좋은 Performance를 가지고 있으니 바꾸라는 Lint가 뜬다. 


 그렇다면 SparseArray는 무엇일까? 


 안드로이드 API version 1 부터 제공되었으며, Java가 아닌, Android 문법으로 만들어졌다. (때문에 자바에서도 사용하려면, hashmap을 쓰는 게 장점이라는 부분도 있지만, 안드로이드에서는 안드로이드의 법을 따라...) 


Sparse의 의미는 "뜨문뜨문 떨어져있는"이다. 


위키를 따르면, 

Map<integer, object>를 사용하는 이유는 put <key, value>를 넣고 get(key)를 통해 value를 가져오기 위함이다. 

이 때 주로 key값에는 value.hashcode()를 사용하게 되며, (HashCode()는 Object의 Method로 int형으로 아이디를 뽑아준다) 

아래 첫번째 그림과 같이, 사용을 할 수 있다. 



하지만, 같은 id값을 가지는 경우도 종종 생기며, 이럴 경우 충돌(Hash collision)이 일어나게 된다. 



이러한 이유 때문에, HashMap에는 changin이란 기법을 사용해 key를 통해 가져온 값이 "Sam Doe"와 맞는지 아닌지를 체크해서 정확한 값을 가져오는 번거로움이 있다. 



그렇다면 SparseArray는 무엇이 다를까


Sparse란 의미가 "데이터로 뜨문뜨문"이란 의미라고 했는데, 이를테면, 데이터 구조가 생겼을 때 위쪽은 뜨문뜨문 비어있는 컬럼이 있는데, 아래쪽에 데이터를 빼곡히 저장이 되어있는 이런 경우를 의미한다고 한다. 안드로이드에서 integer 1~100까지는 비어있고 101~200까지는 데이터가 있는경우, 이런 경우를 대비해 만든 것이 SparseArray이다. 


 위와 같이 hash function을 따로 사용할 필요가 없고, HashMap은 java.lang.integer가 계속 생성되는 반면, SparseArray는 int[] 로 객체가 생성되지 않는 것이 퍼포먼스가 높아지는 이유중 하나라고 한다. 


* SparseArray를 HashMap처럼 사용하기 위해서는, 

SparseArray sparseArr = new SparseArray();

sparseArr.append(key, value);

sparseArr.get(key)

를 통해 사용이 가능하다.


다음은 SparseArray와 HashMap의 성능을 분석한 결과표이다. 






( 흠...일반적으로 큰 데이터가 아닌 이상 크게 효율의 차이가 있을까 하는 의구심이 드는)



반응형