컬랙션계열의 Type Map계열의 Type들을 사용할때 어떠한 관계를 갖는지 그리고 각각 어떤 성능상의 차이가 있는지 그리고 어떤 장단점이 있는지 고려를 하지 않고 원하는 결과만을 위해서 무분별 하게 사용했던것 같다. 우선 이들의 주요 관계는 다음과 같다.

 

 

 

 

ArrayList, Vector, LinkedList는 모두 List 인터페이스를 구현한 클래스이다.

따라서 다음의 코드는 모두 유효하다.

List list = new ArrayList();

List list = new Vector();

List list = new LinkedList();

또한 HashMap Hashtable Map 인터페이스를 구현한 클래스이다. 따라서 다음의 코드들도 유효하다.

Map map = new HashMap();

Map map = new Hashtable();

 

 

 

ArrayList, Vector, LinkedList

 

우선 ArrayListVector간의 API는 유사하다. 모두 List인터패이스를 구현한 클래스로서 순서가 존재하며 인덱스를 사용해서 테이터에 접근이 가능하며 중복된 데이터를 허용한다. 또한 일반적으로 순차적으로 대량의 데이터를 억세스하거나 입력할때 유리한 방식이다. 하지만ArrayList의 경우 동기화(토근을 부여받아 순차적으로 객체에 접근)가 보장되지 않으므로 동기화를 위해서는 직접 처리해줘야 하지만 Vector의 경우 동기화를 자동으로 보장한다.

, 동기화의 경우 그만큼 데이터의 보장 측면에서는 장점이 되지만 성능상에서는 단점이 될수 있다.

 

ArrayList LinkedList의 경우는 어떨까?

이는 연산의 종류에따라 성능상 차이를 확인 할수 있는데

단순히 읽는 시간(접근시간)’을 비교한다면

ArrayList LinkedList에 비해 빠르다.
LinkedList의 데이터 개수가 많아질수록 차이가 심해진다.

 

추가/삭제의 경우

순차적으로 추가/삭제하는 경우에는 ArrayList LinkedList보다 빠르다.

중간 데이터를 추가/삭제하는 경우에는 LinkedList ArrayList보다 빠르다.
다만, ArrayList의 저장공간이 부족해, 더 큰 저장공간을 가진 ArrayList 객체를 만드는 상황이 없다는 가정하에서만 만족한다. (다시 말해, 저장공간이 충분할 때를 가정으로 한다는 말이다)
그렇지 않을 경우 LinkedList가 순차적으로 추가/삭제하는 경우에도 ArrayList보다 빠를 수 있다.

 

결국 다루고자 하는 데이터의 개수가 변하지 않는 경우 : ArrayList가 최상의 선택
데이터 개수의 변경이 잦은 경우 : LinkedList가 더 나은 선택

두 클래스의 장점을 이용해 혼합해서 사용하는 것이 좋음
데이터 저장은 ArrayList를 사용하고, 데이터를 수정하는 작업을 할 때에는 LinkedList로 데이터를 옮겨서 작업하는 것이 권장할만 하겠다.

 

 

HashMap, Hashtable

 

모두 Map계열의 클래스이며 HashMap은 데이터 입출력이 동기화되지 않고 처리속도가 빠른 반면  HashTable은 모든 입출력이 동기화며 처리속도는 다소 떨어지는 특징이 있다.

 

'Java > Core Utilities' 카테고리의 다른 글

Preferences & PreferenceChangeListener  (0) 2013.02.09
Properties  (0) 2013.02.09
Collections과 정렬  (0) 2013.02.09
Timer, TimerTask & TimeZone  (0) 2013.02.09
Date, Calendar and TimeZone  (0) 2013.02.08
Posted by Steven J.S Min
,