Collection_1
by 핫도구반응형
Collection Framework에서 List, Set, Map 3개의 Interface를 구성하였다.
| Interface | 특징 |
| List | 순서가 있고 데이터 중복 허용 |
| ArrayList, LinkedList, Stack,Vector 등 | |
| Set | 순서가 없고 데이터 중복 없음 |
| HashSet, TreeSet 등 | |
| Map | key와 value로 이루어진 집합이며 순서 없고 key는 중복 허용되지 않고 value는 중복허용한다. |
| HashMap, TreeMap 등 |
오늘은 List, Set, Map을 크게크게 알아볼 예정이다.
List
List의 특징
1. List 인터페이스 구현
- 인덱스를 통해 요소에 접근 할 수 있음
2. 중복 허용
- 중복된 값을 저장 가능
3. 순서 보장
- 요소를 추가한 순서대로 저장
4. 동적 크기 조정
- 요소가 추가하면 크기가 자동으로 증가하고 삭제하면 크기가 줄어든다.
| ArrayList | LinkedList | Vector | Stack | |
| 내부구조 | 동적배열 | 이중연결리스트 | 동적배열 | Vector의 확장으로 후입선출구조 |
| 랜덤접근 | 빠름 | 느림 | 빠름 | 빠름 |
| 요소추가 및 제거 | 끝에 추가시 빠르며 중간에 삽입 및 삭제 시 느림 | 중간에 삽입 및 삭제 빠름 | 끝에 추가시 빠르며 중간 삽입 및 삭제는 느림 | push(), pop() 메서드로 후입선출방식 |
| 메모리 사용 | 배열 크기 동적 조정, 메모리 절약 | 각 요소가 이전/다음 요소를 참조하므로 더 많은 메모리 사용 | 동적 배열, 내부적으로 동기화됨 | Vector를 상속받아 동기화됨 |
| 동기화 | 동기화되지 않음 | 동기화되지 않음 | 내부적으로 동기화됨 | 내부적으로 동기화됨 |
| 읽기작업성능 | 빠름 | 느림 | 빠름 | 빠름 |
| 쓰기작업성능 | 중간삽입및삭제 느림 | 삽입 및 삭제가 빠름 | 동기화로 인한 성능 저하 | 후입선출방식이라 쓰기작업은 빠르지만 pop()의 호출과 관련이 있음 |
| 주요용도 | 읽기작업이 많고 데이터 크기가 자주 변하지 않거나 자주 재배열되지 않는 경우 | 삽입 및 삭제가 빈번하게 발생하는 경우 | 멀티스레드 환경에서 안전하게 사용해야하는 경우 | 후입선출방식이 필요한 경우 |
ArrayList
- 장점: 빠른 읽기 작업과 인덱스를 통한 랜덤 접근이 가능하며 크기가 동적으로 조정되므로 크기를 미리 설정할 필요가 없다.
- 단점: 중간에 요소를 삽입하거나 삭제할 때 성능이 떨어지며 메모리를 절약하기 위한 동적 배열 재조정 시 추가 비용이 발생할 수 있다.
LinkedList
- 장점: 삽입 및 삭제가 빠르며, 리스트의 중간에 데이터를 추가하거나 삭제하는 데 유리함
- 단점: 읽기 작업 시 인덱스를 통해 랜덤 접근이 느리며, 각 요소가 이전/다음 요소를 참조하므로 메모리 사용이 더 많이 필요함.
Vector
- 장점: ArrayList와 유사하지만, 내부적으로 동기화가 지원되므로 멀티스레드 환경에서 안전하게 사용할 수 있다.
- 단점: 동기화에 따른 성능 저하가 발생할 수 있어, 현재는 ArrayList가 더 많이 사용됨
Stack
- 장점: 후입선출 방식으로, push(), pop() 메서드를 통해 데이터를 다룰 수 있다.
- 단점: Vector를 상속받아 동기화가 포함되어 있어 성능이 떨어질 수 있다.
Set
Set의 특징
1. 중복된 요소를 허용하지 않음
2. 일반적으로 순서가 보장되지 않음
3. 순차적 접근만 가능하다.
4. null값이 허용된다.
- 하지만 중복된 요소가 허용되지 않기 떄문에 null값은 1개만 존재할 수 있다.
| HashSet | LinkedHashSet | TreeSet | EnumSet | CopyOnWriteArraySet | |
| 중복허용 | 불가 | 불가 | 불가 | 불가 | 불가 |
| 순서보장 | 안됨 | 삽입순서유지 | 정렬된 순서 유지 | 열거형의 순서 유지 | 삽입순서유지 |
| 사용 예 | 일반적인 집합 | 순서가 중요한 집합 | 정렬된 순서가 중요한 집합 | 열거형에 대한 집합 연산 | 멀티스레드 환경에서 사용 |
HashSet
- 장점: 빠른 성능으로 데이터 처리 가능하며 해시테이블 기반으로 메모리 효율성이 높다.
- 단점: 순서가 보장되지 않으며 해시함수가 잘못 설계되면 해시 충돌로 인해 성능이 저하될 수 있다.
LinkedHashSet
- 장점: 삽입순서대로 순서가 보장이 되어 순서가 중요한 경우 유용하며 빠른 성능을 제공한다.
- 단점: 많은 메모리를 사용하며 HashSet보다 약간 느릴 수 있다.
TreeSet
- 장점: 자동으로 오름차순으로 정렬하여 저장하기 때문에 정렬된 순서가 중요한 경우 유용하며 검색 시 범위 선택에 유리
- 단점: 성능이 느리며 메모리사용량이 상대적으로 많다.
EnumSet
- 장점: 열거형(Enum)타입에 최적화되었기에 매우 빠르고 메모리 효율적이며 저장시 열거형타입의 경우 매우 효율적으로 메모리 사용
- 단점: 열거형(Enum)타입만 지원하기 때문에 범용성이 떨어짐
CopyOnWriteArraySet
- 장점: 멀티스레드 환경에서 안전하게 사용할 수 있고 읽기작업이 많은 경우 유용하다.
- 단점: 쓰기성능에 적합하지 않으며 배열복사본을 매번 생성하므로 메모리 사용량이 증가할 수 있다.
Map
Map의 특징
1. key-value의 쌍으로 저장
2. 중복 key를 허용하지 않음
3. 중복 value를 허용
4. key를 사용한 빠른 접근 가능
| HashMap | TreeMap | LinkedHashMap | WeakHashMap | |
| 순서보장 | 없음(랜덤순서) | 키 순서대로 정렬 | 삽입순서대로 유지 | 없음 |
| 정렬기준 | 없음 | 키 기준 자동정렬(오름차순) | 삽입 순서대로 유지 | 없음 |
| 'null' key값 허용유무 | 허용 | 불가 | 허용 | 불가 |
| 'null' value값 허용유무 | 허용 | 허용 | 허용 | 허용 |
| 대표적인 사용 예 | 빠른 조회, 삽입 필요 | 정렬된 키가 필요한 경우 | 순서가 중요한 경우 | 가비지컬랙션 관리가 필요한 경우 |
HashMap
- 장점: 빠른 성능으로 데이터 처리 가능하며 key와 value 값이 null을 허용하여 유연적
- 단점: 순서를 보장하지 않고 일정한 메모리 오버헤드가 발생할 수 있음
TreeMap
- 장점: key를 자동으로 정렬하므로 key의 순서가 중요한 경우 유용하며 특정 범위 내 key값을 쉽게 추출 가능
- 단점: 상대적으로 느려 성능이 떨어질 수 있고 key값에 null을 허용하지 않음
LinkedHashMap
- 장점: 삽입한 순서대로 순서가 보장이 되며 빠른 성능으로 데이터 처리가 가능하다.
- 단점: 순서까지 유지되기 때문에 더 많은 메모리 사용하며 순서관리비용이 발생할 수 있다.
WeakHashMap
- 장점: 다른곳에서 참조되지 않으면 가비지컬렉터에 의해 자동으로 제거되기에 메모리 누수 방지 가능하며 메모리를 효율적으로 사용할 수 있다.
- 단점: 가비지컬랙션이 언제 일어날지 알 수 없기 때문에 예기치 못한 동작이 일어날 수 있으며 가비지컬렉션을 관리하는데 추가적인 오버헤드가 발생 할 수 있다.
여기까지 Collection의 가장 큰 틀인 List, Set, Map의 특징들과 각각이 가지고 있는 클래스들의 장점과 단점에 대해 알아봤으며 이후 하나씩 살펴보며 어떤 상황에서 사용하는 것이 더 유용할지 알아보는 시간을 가져 볼 예정이다.
반응형
'JAVA > OLD' 카테고리의 다른 글
| Collection_3_Set (0) | 2025.02.25 |
|---|---|
| Collection_2_List (0) | 2025.02.11 |
| JSTL LOOP(forEach) (0) | 2024.08.19 |
| JSTL_if, choose(조건분기) (0) | 2024.08.19 |
| JSTL_Basic (0) | 2024.08.19 |
블로그의 정보
AquaMan
핫도구