Collection framework
ArrayList
동적으로 크기가 조절되는 배열
ArrayList arr = new ArrayList();
arr.add("one");
arr.add("two");
System.out.println(arr.get(0));
Vector
모두 List 인터페이스를 구현하고, 삽입 순서를 유지한다는 점, 동적으로 크기가 조절되는 배열을 필요로 할 때 사용된다는 점에서 ArrayList와 비슷하다.
Vector는 동기화(synchronnize)되어 있다는 점에서 차이가 있다. 즉, 한 번에 하나의 스레드만 Vector 메서드를 호출할 수 있다. (Thread-safe)
LinkedList
순환자(iterator)를 어떻게 사용하는지 잘 보여줌
LinkedList likedList = new LinkedList();
linkedList.add("two");
linkedList.addFirst("one");
Iterator iter = linkedList.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
Stack
말 그대로 데이터를 쌓아올린다(stack)는 의미
LIFO(Last-In-First-Out)에 따라 자료를 배열
pop()
: 가장 위에 있는 항목을 제거push()
: item 하나를 가장 윗 부분에 추가peek()
: 가장 위에 있는 항목을 반환isEmpty()
: 스택이 비어있을 때 true 반환
같은 방향에서 item을 추가/삭제한다는 조건 하에 LinkedList로 구현할 수도 있다.
public class MyStack {
private static class StackNode {
private T data;
private StackNode next;
public StackNode(T data) {
this.data = data;
}
}
private StackNode top;
public T pop() {
if (top == null) throw new EmptyStackException();
T item = top.data;
top = top.next;
return item;
}
public void push(T item) {
StackNode t = new StackNode(item);
t.next = top;
top = t;
}
public T peek() {
if (top == null) throw new EmptyStackException();
return top.data;
}
public boolean isEmpty() {
return top == null;
}
}
Queue
FIFO (First-In-First-Out) like 매표소 줄
add(item)
: item을 리스트의 끝 부분에 추가remove()
: 리스트의 첫 번째 항목 제거peek()
: 가장 위에 있는 항목 반환isEmpty()
: 큐가 비어있을 때 true 반환
HashMap
key-value 쌍으로 이루어진다.
검색과 삽입에 O(1) 시간이 소요된다.
키를 기준으로 순회할 때 키의 순서는 무작위로 섞여있다.
Q2-1. TreeMap, HashMap, LinkedHashMap의 차이?
세 가지 모두 key-value의 대응 관계가 있고, key를 기준으로 순회(iterate) 가능하다.
시간 복잡도와 키가 놓이는 순서에 차이가 있다.
HashMap | Tree Map | LinkedHashMap |
---|---|---|
검색/삽입에 O(1) | 검색/삽입에 O(logN) | 검색/삽입에 O(1) |
키 순서 무작위 | 정렬된 순서로 키 순회 가능 | 키는 삽입된 순서대로 정렬 양방향 연결 버킷(double-linked bucket)으로 구현 |