본문 바로가기
개발/자바

HashMap,HashTable,LinkedHashMap,ConcurrentHashMap

by darksilber 2012. 4. 13.
반응형

출처 - http://dodo4989.tistory.com/450

 

음...요새 자주 접하게 되는 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 경우는

성능이 느리다.


ConcurrentHashMapHashTable과 기능 및 특징은 동일하지만 성능향상이

되었다


내부적으로 여러 개의 세그먼트를 두고 각 세그먼트마다 별도의 락을 가지고 있다.



여러 Thread에서 ConcurrentHashMap객체에 동시에 데이터를 삽입, 참조하더라도


그 데이터가

다른 세그먼트에 위치하면 서로 락을 얻기 위해 경쟁하지 않는다.


----------------------------------------------------------------------------------------------------------

 

 

출처 - http://jace.tistory.com/73

 

jdk1.5.x 버전부터 java.util.concurrent 패키지가 추가 되었으며
몇몇 유용한 클래스들이 존재한다.

이번에 소개할 클래스는 ConcurrentHashMap이다.

클래스명을 통해서도 쉽게 유추 되겠지만
동기화를 제공하는 Map구현 클래스이다.


그럼 이전 jdk버전에서 제공되던 Hashtable과 HashMap과의 어떤 차이가 있을까?

우선 jdk1.5.x 이전버전의 Hashtable과 HashMap의 차이점을 살펴보자.

1. 동기화 제공 여부
2. null값 포함 가능 여부

Hashtable을 통해 생성된 객체는 값 변경시에 동기화를 지원하는 반면
HashMap은 동기화를 지원하지 않는다.
이런이유에서 속도는 HashMap이 훨씬 빠르다.

또한 Hashtable은 key, value에 null을 값을 가질 수 없지만
HashMap은 가질 수 있다.

특별히 동기화가 필요하지 않는 경우 성능문제로
대 부분 HashMap을 사용했었다.

그렇다면 ConcurrentHashMap은?

일반적인 기능 및 특징은 Hashtable과 동일하다.
다만 Hashtable의 단점인 성능 부분을 엄청 향상시켜서
HashMap과 거의 성능차이가 없을 정도로 빨라졌다고 한다.

(아직 성능 테스트는 해보지 않았음.)

현재 진행되고 있는 Project에서 적용해서 사용하고 있는데
아직까지 문제발생된 부분은 없다.

반응형

댓글