List,Set,Map의 Class중 어떤것을 쓸것인지 판단할수 있도록 표로 정리해 보았다.
용어 |
List : 중복을 허용하고, index를 통한 접근을 한다. index가 부족하게 되면 메모리를 새로 할당하여 복사하여 구성하게 된다. Set : 집합(수학), 집합은 중복을 허용하지 않고 교집합/합집합/차집합등을 지원한다.(And(교집합), OR(합집합), XOR (Not Or)등을 지원함) | |||||||||||
Hash : Hash Function을 말하며 고유한 Key값(Unique Key)을 주면 고유한 값을 Return한다(중복안됨). Hash연산은 다방면으로 사용되어지고 있다. | ||||||||||||
Linked : Array의 전/후의 값이 서로 Link[양방향연결고리]되어 있어 계속늘어날 수 있으나, 중간검색이 되지 않아 검색속도가 느리다. 수정/추가/삭제가 빠르다 | ||||||||||||
Tree : Hash Function은 고유값을 주기때문에 정렬이 되지 않는다. 이를 개선한 Balance Tree로 정렬된 방식( Oracle-Index와 유사하다) Tree안에 들어가는 Object는 [Comparable Interface]를 [Implement]한 Object여만 한다. (왜? 자동정렬하려면 기존값과 입력되는 값이 비교해야 하므로..ㅋㅋ) | ||||||||||||
int a[3] = { 0, 1, 2, 3, 4 } | ||||||||||||
사용시점 | C의 Array처럼 특정변수를 나열해서 사용하고자 할 때 사용한다. | |||||||||||
예제 | 소수의 집합 int a[5] = { 1 , 2 , 3, 5 , 7, 13 } | |||||||||||
1차원 Array | Legacy | 이름 | 구분 | 사용시점 | ||||||||
The Enumeration | Interface | BitSet, Vector , Stack에서 Method [ hasMoreElements, nextElement]를 사용하고자 할 때 | ||||||||||
BitSet | Class | 중복허용(X) Array A와 Array B를 Bit연산(And , OR, XOR,etc )을 수행하여 결과를 보고자 할 때 | ||||||||||
Vector | Class |
중복허용(O) / [ArrayList]와 유사하다. ArraryList보다 속도가 느리고, Multi Thread 에 대해서 좀더 안전하다 | ||||||||||
Stack | SubClass of Vector | 중복허용(O) Array의 들어가는 대상이 동적이며, LIFO방식으로 접근하고자 할 때 | ||||||||||
Collection Framework |
The Collection | Interface | [Set][List]의 최상위 Interface | |||||||||
HashSet | Class | 중복허용(X), 정렬(X) Hash function을 수행하여 관리한다. | ||||||||||
LinkedHashSet | SubClass of HashSet | 중복허용(X), 정렬(X), HashSet대비(수정/삽입빠름, 검색느림) Hash function을 수행하여 관리한다. | ||||||||||
TreeSet | Class |
중복허용(X), 정렬(O) , 기본Ascending, 대량의 데이터 검색시 매우빠름 | ||||||||||
LinkedList | Class |
중복허용(O), 정렬(X), ArrayList대비(수정/삽입/삭제 빠름, 검색느림) | ||||||||||
ArrayList | Class |
중복허용(O), 정렬(X) , C의 Array의 Java 확장판임. | ||||||||||
int a[3][1] = {"key1", 10 } , { "key2", 20 } , { "key3" , 30 } , { "key4, 40 } , { "key5", 50 } | ||||||||||||
사용시점 | C의 Array를 2차원으로 선언하여 앞에값은 [Key]값을 뒤에 해당 Key가 물고있는 Value로 사용하고자 할 때 사용한다. | |||||||||||
예제 | 주민번호/이름 = { "xxxxxx" , "홍길동" } , { "zzzzzz", "이순신" } , { "xxxxx", "유관순" } | |||||||||||
2차원 Array | Legacy | 이름 | 구분 | 사용시점 | ||||||||
The Dictionary | abstract class | [Map Interface]로 대체되었음 | ||||||||||
The Hashtable | Class | {"Key1", 숫자} , {"Key1", 10 } , {"Key2", 20 } /Value가 숫자형일때 / Key가 중복금지 | ||||||||||
The Properties | SubClass of Hashtable | {"Key1", "문자열"} , {"Key1", "aaa" } , {"Key2", "bbb" } /Value가 문자열일때 / Key중복금지 | ||||||||||
Collection Framework |
HashMap | Class | Key중복허용(X), Key정렬(X) Hash function을 수행하여 관리한다. | |||||||||
LinkedHashMap | SubClass of HashMap | Key중복허용(X), Key정렬(X), HashMap대비(수정/삽입빠름, 검색느림) Hash function을 수행하여 관리한다. | ||||||||||
TreeMap | Class | Key중복허용(X), Key정렬(O) , 기본Ascending, 대량의 데이터 검색시 매우빠름 | ||||||||||
WeakHashMap | Class | Key중복허용(X), Key정렬(X) HashMap에 메모리관 관리부분 효율성을 확보한다.. ( 참조가 약한 값들을 Garbage collector가 자동으로 지울수 있도록함 ) =>메모리 효율이 올라가나 예상치 못한 데이터상의 오류가 발생할 여지가 있다. | ||||||||||
IdentityHashMap | Class | Key중복허용(X), Key정렬(X) 참조변수(Reference Valiable)를 통한 값의 비교시 사용되는 극히 드문경우에 사용되는 Map이다. |
Java Collection Framework (JCF)
: Java에서 데이터를 저장하는 기본적인 자료구조들을 한 곳에 모아 관리하고 편하게 사용하기 위해서 제공하는 것을 의미한다. 다음은 JCF의 상속 구조이며 사용 용도에 따라 List, Set, Map 3가지로 요약할 수 있다.
■ 각 인터페이스의 특징
인터페이스 |
구현 클래스 |
특징 |
List |
LinkedList Stack Vector ArrayList |
순서가 있는 데이터의 집합, 데이터의 중복을 허용한다. |
Set |
HashSet TreeSet |
순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다. |
Map |
HashMap TreeMap HashTable Properties |
키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합이다. 순서는 유지되지 않고, 키는 중복을 허용하지 않으며 값의 중복을 허용한다. |
■ Collection Interface
: 모든 콜렉션의 상위 인터페이스로써 콜렉션들이 갖고 있는 핵심 메소드를 선언 (add, contain, isEmpty, remove, size, iterator ...)
-
List Interface
- ArrayList
- 상당히 빠르고 크기를 마음대로 조절할 수 있는 배열
- 단방향 포인터 구조로 자료에 대한 순차적인 접근에 강점이 있음
- Vector
- ArrayList의 구형버전이며, 모든 메소드가 동기화 되어있음
- 잘 쓰이진 않음
- LinkedList
- 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 빠른 성능을 보장.
- 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임
- Set Interface
- HashSet
- 가장 빠른 임의 접근 속도
- 순서를 전혀 예측할 수 없음
- LinkedHashSet
- 추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능
- TreeSet
- 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음
■ Map Interface
: Key와 Value의 쌍으로 연관지어 저장하는 객체
- HashMap
- Map 인터페이스를 구현하기 위해 해시테이블을 사용한 클래스
- 중복을 허용하지 않고 순서를 보장하지 않음
- 키와 값으로 null이 허용
- Hashtable
- HashMap 보다는 느리지만 동기화가 지원
- 키와 값으로 null이 허용되지 않음
- TreeMap
- 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장
- 정렬된 순서로 키/값 쌍을 저장하므로 빠른 검색이 가능
- 저장시 정렬(오름차순)을 하기 때문에 저장시간이 다소 오래 걸림
- LinkedHashMap
- 기본적으로 HashMap을 상속받아 HashMap과 매우 흡사
- Map에 있는 엔트리들의 연결 리스트를 유지되므로 입력한 순서대로 반복 가능
■ 각 클래스의 메소드 링크
■ 출처
- http://withwani.tistory.com/150
- http://blog.naver.com/windziel/60048694876
- http://www.gliderwiki.org/wiki/99
- http://www.java-school.net/java/10.php
- http://hackersstudy.tistory.com/26
'프로그래밍 > JAVA' 카테고리의 다른 글
디자인 패턴 MVC (0) | 2018.01.03 |
---|---|
디자인 패턴 : FACTORY METHOD (0) | 2018.01.03 |
추상메서드와 인터페이스 공통점, 차이점 (0) | 2017.12.22 |
개발자가 놓치기 쉬운 자바의 개념, 기본원리 (0) | 2017.12.13 |
이클립스(Eclipse) UML 이용할수 있는 플러그인 설치와 사용 – UML Designer (0) | 2017.12.01 |