설.현.아빠
HashMap, HashTable, LinkedHashMap, ConcurrentHashMap 알아보기 본문
음...요새 자주 접하게 되는 Data Storage이다. 보통 <key, value> 형태로 put하고 get(key)를 통해 value를 가져온다.
value에는 Bitmap, Class, Drawable....등등등을 넣을 수 있다.
현재까지 내가 파악한 MAP Interface에는 HashMap, HashTable, LinkedHashMap, ConcurrentHashMap 이다.
요요 세가지에 대해서 자세히 살펴보자^^
1. HashMap VS HashTable
비동기화 VS 동기화
비동기화가 성능이 좋고, 동기화는 성능이 안좋다.
중요한 것은 HashMap 을 Multi Thread 환경에서 사용하면 안된다. 여러개의 Thread가 동시에 HashMap 을 건드려서
key, value 를 넣게 되면 문제가 발생 할 수 있다.
참조 : http://blog.naver.com/borahoon?Redirect=Log&logNo=120122900827
2. HashMap, HashTable VS LinkedHashMap
Data 추출시 저장된 순서에 상관없이 랜덤 추출 VS Data 추출시 저장된 순서대로 추출
LinkedHashMap의 경우 아래와 같이 세번째 인자값을 true 로 설정 해줌으로써 저장순서 대신 접근순서에
대한 기록을 유지한다. 참고로 첫번째 인자는 map의 크기, 두번째 인자는 LoadFactor로써 capacity의 몇%가
차게되면 용량을 늘려야 할 것인가를 설정한다.
LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY / 2, 0.75f, true)
접근 순서란 get이나 put의 호출을 말하며 Iteration(참조 : http://www.sjava.net/69) 순서는 오래전에 접근된 것부터
최근에 접근된 순서이다.
참조 : http://www.javastudy.co.kr/docs/techtips/020913.html
3. ConcurrentHashMap
동기화를 제공하는 MAP Interface.
동기화가 필요치 않다면 HashMap을 사용하였고, 동기화를 지원 하는
HashTable 의 경우는성능이 느리다.
ConcurrentHashMap은 HashTable과 기능 및 특징은 동일하지만 성능향상이
되었다
내부적으로 여러 개의 세그먼트를 두고 각 세그먼트마다 별도의 락을 가지고 있다.
여러 Thread에서 ConcurrentHashMap객체에 동시에 데이터를 삽입, 참조하더라도
그 데이터가
다른 세그먼트에 위치하면 서로 락을 얻기 위해 경쟁하지 않는다.