JCF(Java Collectoin Framework)는 데이터들을 저장하고 관리하는 다양한 자료구조를 인터페이스들로 정의하고 각각의 구현체들을 제공한다. 대표적인 인터페이스로는 List, Set, Map이 있으며 각 인터페이스를 구현한 클래스들은 다양하게 존재하며, 아래 그림은 각 인터페이스와 구현체의 상속관계를 나타내고 있다.
Map 인터페이스는 Collection을 상속받고 있지 않지만 일반적으로 Collection으로 분류된다.
1. List 인터페이스
list는 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용하는 자료구조이다. 배열과 비슷하다. list는 객체 자체를 저장하는 것이 아니라 객체의 주소를 참조한다. 따라서 동일한 객체를 중복 저장할 수 있는데, 이 경우에는 동일한 주소가 참조되고 null이 저장될 경우에는 해당 인덱스는 객체를 참조하지 않는다.
ArrayList
List<E> list = new ArrayList<E>();
- 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있다.
- 더 이상 저장공간이 없으면, 더 큰 새로운 배열을 생성해 기존의 배열에 저장된 내용을 복사한다.
- 중간에 데이터가 삽입되면, 데이터들이 뒤로 밀리면서 성능저하가 크다.
Vector
List<E> list = new Vector<E>();
- 과거에 대용량 데이터 처리를 위해 사용했으나, 내부에서 쓰레드의 개수와 상관없이 동기화 처리를 하므로 성능이 좋지않아 최근에는 쓰이지 않는다.
- Thread - safe
LinkedList
List<E> list = new LinkedList<E>();
- 양방향 포인터 구조로 내부 객체를 저장해서 인덱스로 관리하지만, 인접 참조를 링크해서 체인처럼 관리한다.
- 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰인다.
+ ArrayList vs LinkedList
- 단순히 데이터를 조회하거나, 맨 마지막에 객체를 추가하는 경우가 빈번히 발생하면 ArrayList가 데이터가 중간에 추가, 삭제가 빈번히 일어나면 LinkedList가 더 좋은 성능을 발휘한다. 이유는 위에서 설명한 각 내부구조의 특징 때문이다.
2. Set 인터페이스
Set은 순서가 없는 데이터 집합이고, 데이터의 중복을 허용하지 않는다. 수학에서의 집합의 개념과 비슷하다.