컬렉션 프레임워크란?
- 다수의 데이터를 다루기 위한 자료구조를 표현하고 사용하는 클래스의 집합
- 컬렉션 프레임워크의 모든 클래스는 Collection 인터페이스를 구현하는 클래스 또는 인터페이스
1. List
- 순서가 있는 데이터의 집합, 데이터 중복 허용
ArrayList, LinkedList, Stack 등등
2. Set
- 순서를 유지하지 않는 데이터의 집합, 데이터의 중복 허용 X
HashSet, TreeSet 등등
3. Map
- 키(key)와 값(value)의 쌍으로 이뤄진 데이터의 집합
- 순서는 유지되지 않으며 키는 중복 허용 X, 값은 중복 허용
HashMap, TreeMap 등등
4. Stack
- 마지막에 넣은 데이터를 먼저 꺼내는 자료구조, LIFO(Last In First Out)
Stack, ArrayDeque 등등
5. Queue
- 먼저 넣은 데이터를 먼저 꺼내는 자료구조, FIFO(First In First Out)
Queue, ArrayDeque 등등
List
- 순서가 있는 나열된 데이터를 표현
- ArrayList는 배열을 이용하여 데이터를 저장하는 List의 인터페이스
public static void main(String[] args) {
List<Integer> list = new ArrayList();
//list 삽입
list.add(1);
list.add(3);
list.add(2);
System.out.println(list); //[1, 3, 2]
//list 정렬
Collections.sort(list);
System.out.println(list); //[1, 2, 3]
//list 크기
System.out.println(list.size()); //3
//해당 index 삭제
list.remove(2); //[1, 2]
System.out.println(list);
//반복문을 통해 list 값 하나하나 출력
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
for (int i : list) {
System.out.println(i);
}
}
Set
- 순서를 유지하지 않는 데이터의 집합
- 데이터의 중복 허용 X
- HashSet은 Set 인터페이스를 구현한 대표적 컬렉션
public static void main(String[] args) {
/*
* Collections 의 자료형에는 primitive 타입 올 수 없음
* primitive 타입에 해당하는 class
*/
Set<Integer> hashSet = new HashSet<>();
//set 삽입
hashSet.add(1);
hashSet.add(3);
hashSet.add(2);
hashSet.add(4);
System.out.println(hashSet); //순서 지켜지지 않고 출력
Set<String> stringSet = new HashSet<>();
stringSet.add("Korea");
stringSet.add("USA");
stringSet.add("Japan");
stringSet.add("China");
System.out.println(stringSet); //순서 지켜지지 않고 출력
//stringSet 에서 China 값 제거
stringSet.remove("China");
System.out.println(stringSet); //China 제외 나머지 데이터 출력
//stringSet 내의 target 데이터들을 모두 제거
ArrayList<String> target = new ArrayList<>();
target.add("USA");
target.add("Japan");
stringSet.removeAll(target);
System.out.println(stringSet); //Korea 만 남고 모두 제거됨
//stringSet 에 존재 여부 확인
System.out.println(stringSet.contains("Korea")); //true
System.out.println(stringSet.contains("USA")); //false
//stringSet 의 크기
System.out.println(stringSet.size()); //1
//stringSet 의 모든 데이터 삭제
stringSet.clear();
System.out.println(stringSet); //[]
}
Map
- HashMap은 키(key)와 값(value)을 하나의 데이터로 저장하는 특징 존재
- 해싱(hashing)이 가능하여 데이터를 검색하는데 뛰어난 성능
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "Korea");
map.put(2, "USA");
map.put(3, "Japan");
System.out.println(map);
System.out.println(map.get(1)); //key=1에 해당하는 Korea 출력
map.remove(2); //key=2에 해당하는 USA 삭제
System.out.println(map);
//key=3이 존재하는지 확인
System.out.println(map.containsKey(3)); //true
//Korea 값을 갖는 value가 존재하는지 확인
System.out.println(map.containsValue("Korea")); //true
System.out.println(map.containsValue("USA")); //false
//모든 데이터 삭제
map.clear();
System.out.println(map); //{}
}
Stack
- 마지막에 저장한 데이터를 가장 먼저 꺼내는 자료구조, LIFO(Last In First Out)
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
//stack 에 순서대로 데이터 삽입
stack.push(1);
stack.push(3);
stack.push(5);
stack.push(7);
System.out.println(stack); //[1, 3, 5, 7]
//stack 의 가장 상단 값(최근에 삽입된 값)을 반환, 삭제 X
System.out.println(stack.peek()); //7
//stack 의 가장 상단 값(최근에 삽입된 값)을 반환 및 삭제
System.out.println(stack.pop()); //7
//stack 의 크기
System.out.println(stack.size()); //3
//stack 내의 데이터 존재 여부 확인
System.out.println(stack.contains(1)); //true
//stack 비어있는지 확인
System.out.println(stack.empty()); //false
}
Queue
- 처음에 저장한 데이터를 가장 먼저 꺼내게 자료구조, FIFO(First In First Out)
- 우선순위 큐, 원형 우선순위 큐, 원형 큐 등 다양한 큐 존재
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
//queue 에 데이터 삽입
queue.add(1);
queue.add(3);
queue.add(5);
System.out.println(queue); //[1, 3, 5]
//가장 앞의 데이터를 반환
System.out.println(queue.peek()); //1
System.out.println(queue.size()); //3
//가장 먼저 들어왔던 데이터를 삭제 및 반환
System.out.println(queue.poll()); //1
System.out.println(queue.size()); //2
}
ArrayDeque
- 위의 Queue는 한쪽에서만 값이 삽입되고 다른 한쪽에서는 값을 반환하는 자료구조, FIFO(FIrst In First Out)
- deque는 양 끝에서 삽입과 반환 모두 가능
public static void main(String[] args) {
ArrayDeque<Integer> arrayDeque = new ArrayDeque<>();
//arrayDeque 의 앞에 데이터 삽입
arrayDeque.addFirst(1);
arrayDeque.addFirst(2);
arrayDeque.addFirst(3);
System.out.println(arrayDeque); //[3, 2, 1]
//arrayDeque 의 끝에 데이터 삽입
arrayDeque.addLast(0);
System.out.println(arrayDeque); //[3, 2, 1, 0]
//addFirst 와 비슷하지만, 큐의 크기에 문제 발생 시
//addFirst 는 exception, offerFirst 는 false 반환
arrayDeque.offerFirst(4);
System.out.println(arrayDeque); //[4, 3, 2, 1, 0]
System.out.println(arrayDeque.size()); //5
//arrayDeque 의 첫번째 값 반환 및 삭제
System.out.println(arrayDeque.removeFirst()); //4
System.out.println(arrayDeque.pollFirst()); //3
//arrayDeque 의 마지막 값 반환 및 삭제
System.out.println(arrayDeque.removeLast()); //0
System.out.println(arrayDeque.pollLast()); //1
System.out.println(arrayDeque); //[2]
//arrayDeque 의 첫번째 값 반환
System.out.println(arrayDeque.peekFirst()); //2
//arrayDeque 의 마지막 값 반환
System.out.println(arrayDeque.peekLast()); //2
}