컬렉션 프레임워크
collection framework
자바에서 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다
즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것입니다.
이러한 컬렉션 프레임워크는 자바의 인터페이스(interface)를 사용하여 구현됩니다.
List, Set, Map, HashMap의 차이
1. List
- 순서가 있고 중복을 허용합니다.
- 인덱스로 원소에 접근이 가능합니다.
- 크기가 가변적입니다.
1-1. List의 종류와 특징
LinkedList
- 양방향 포인터 구조로 데이터 삽입, 삭제가 빠르다.
- ArrayList보다 검색이 느리다.
ArrayList
- 단반향 포인터 구조로 데이터 순차적 접근에 강점을 가진다.
- 배열을 기반으로 데이터를 저장한다.
- 데이터 삽입, 삭제가 느리다.
- 데이터 검색이 빠르다.
2. Set
- 데이터의 집합이며 순서가 없고 중복된 데이터를 허용하지 않습니다.
- 중복되지 않은 데이터를 구할 때 유용합니다.
- 빠른 검색 속도를 가집니다.
- 인덱스가 따로 존재하지 않기 때문에 iterator를 사용합니다.
2-1. Set의 종류와 특징
HashSet
- 인스턴스의 해시값을 기준으로 저장하기 때문에 순서를 보장하지 않는다.
- NULL 값을 허용한다.
- TreeSet보다 삽입, 삭제가 빠르다.
LinkedHashSet
TreeSet
- 이진 탐색 트리(Red-Black Tree)를 기반으로 한다.
- 데이터들이 오름차순으로 정렬된다.
- 데이터 삽입, 삭제에는 시간이 걸리지만 검색, 정렬이 빠르다.
3. Map
- Key와 Value의 한쌍으로 이루어지는 데이터의 집합.
- Key에 대한 중복이 없으며 순서를 보장하지 않습니다.
- 뛰어난 검색 속도를 가집니다.
- 인덱스가 따로 존재하지 않기 때문에 iterator를 사용합니다.
3-1. Map의 종류와 특징
HashMap
- Key에 대한 중복이 없으며 순서를 보장하지 않는다.
- Key와 Value 값으로 NULL을 허용한다.
- 동기화가 보장되지 않는다.
- 검색에 가장 뛰어난 성능을 가진다.
HashTable
- 동기화가 보장되어 병렬 프로그래밍이 가능하고 HashMap 보다 처리속도가 느리다.
- Key와 Value 값으로 NULL을 허용하지 않는다.
LinkedHashMap
TreeMap
- 이진 탐색 트리(Red-Black Tree)를 기반으로 키와 값을 저장한다.
- Key 값을 기준으로 오름차순 정렬되고 빠른 검색이 가능하다.
- 저장 시 정렬을 하기 때문에 시간이 다소 오래 걸린다.
4. Map VS HashMap 차이
구현 방식:
-
Map은 인터페이스이며, 이를 구현하는 클래스는 다양합니다. 예를 들어, "TreeMap", "LinkedMap", "HashTable" 등이 있습니다.
-
HashMap은 "Map" 인터페이스를 구현한 클래스 중 하나입니다.
성능:
- Map의 구현 클래스 중에서는 "TreeMap"과 같이 이진 검색 트리를 사용하여 데이터를 저장하는 클래스도 있지만, "HashMap"은 해시 테이블을 사용하여 데이터를 저장합니다.
- 해시 테이블은 키를 해시 함수를 사용하여 해시값으로 변환하고, 이를 인덱스로 사용하여 값을 저장합니다. 이 방식은 데이터의 검색 및 삽입에 O(1)의 상수 시간을 보장합니다. 반면, 이진 검색 트리는 데이터의 검색 및 삽입에 O(log n)의 시간이 소요됩니다.
따라서, "HashMap"은 "Map"의 다른 구현 클래스보다 빠른 성능을 보장합니다.
동기화:
- Map은 멀티스레드 환경에서 안전하지 않습니다. 즉, 여러 스레드가 동시에 "Map" 객체를 수정하면 데이터의 무결성이 보장되지 않을 수 있습니다.
- HashMap은 스레드 안전하지 않은 자료구조이므로, 멀티스레드 환경에서 사용할 경우에는 동기화 처리가 필요합니다.
따라서, "Map"과 "HashMap"은 데이터 저장 방식, 성능, 동기화 등에서 차이가 있으며, 사용 상황에 따라 선택해야 합니다.
- 일반적으로 단일 스레드 환경에서는 "HashMap"이 더 빠르고 간편하며, 멀티스레드 환경에서는 "ConcurrentHashMap"과 같이 스레드 안전한 자료구조를 사용하는 것이 안전하고 좋은 선택입니다.
참고
https://coding-factory.tistory.com/550
https://hudi.blog/java-collection-framework-1/
https://juyoungit.tistory.com/587