
Deque의 메서드들은 기능은 비슷한데, 실패를 처리하는 방식이 다르다.
getFirst / getLast vs peekFirst / peekLastpublic E getFirst() {
E e = elementAt(elements, head);
if (e == null)
throw new NoSuchElementException();
return e;
}
public E peekFirst() {
return elementAt(elements, head);
}
| 메서드 | 비어 있을 때 |
|---|---|
getFirst / getLast | ❌ 예외 |
peekFirst / peekLast | ⭕ null |
Deque<Integer> dq = new ArrayDeque<>();
dq.peekFirst(); // null
dq.getFirst(); // NoSuchElementException
peekget-> 조회만 하는데도 실패 정책이 다르다
addFirst / addLast vs offerFirst / offerLastpublic boolean offerFirst(E e) {
addFirst(e);
return true;
}
public void addFirst(E e) {
if (e == null)
throw new NullPointerException();
final Object[] es = elements;
es[head = dec(head, es.length)] = e;
if (head == tail)
grow(1);
}
| 메서드 | 실패 처리 |
|---|---|
add | ❌ 예외 |
offer | ⭕ boolean 반환 |
⚠️ ArrayDeque에서는 실제로 offer가 false를 반환하는 경우가 거의 없다
(용량이 자동으로 늘어나기 때문)
dq.offerFirst(null);
이건?
이유:
Deque<Integer> dq = new ArrayDeque<>();
dq.addLast(1); // OK
dq.offerLast(2); // true
dq.offerLast(null); // NullPointerException
removeFirst / removeLast vs pollFirst / pollLastpublic E removeFirst() {
E e = pollFirst();
if (e == null)
throw new NoSuchElementException();
return e;
}
public E pollFirst() {
final Object[] es;
final int h;
E e = elementAt(es = elements, h = head);
if (e != null) {
es[h] = null;
head = inc(h, es.length);
}
return e;
}
| 메서드 | 비어 있을 때 |
|---|---|
remove | ❌ 예외 |
poll | ⭕ null |
Deque<Integer> dq = new ArrayDeque<>();
dq.pollFirst(); // null
dq.removeFirst(); // NoSuchElementException
poll → null 반환
remove → poll 호출 → null이면 예외
-> remove는 poll을 감싼 “강한 버전”
| 메서드 | 비어 있음 |
|---|---|
| get | 예외 |
| peek | null |
| 메서드 | 실패 |
|---|---|
| add | 예외 |
| offer | false (ArrayDeque에선 거의 없음) |
| 메서드 | 비어 있음 |
|---|---|
| remove | 예외 |
| poll | null |
Integer cur = dq.pollFirst();
if (cur == null) break;
peek / poll / offer 위주int cur = dq.removeFirst();
get / add / removeDeque의 메서드들은 기능보다 실패 처리 방식이 다르다.
get·add·remove는 실패 시 예외를 던지고, peek·offer·poll은 실패를 반환값(null/false)으로 표현한다.
따라서 어떤 메서드를 쓰느냐는 “실패를 예외로 볼지, 흐름의 일부로 볼지”에 달려 있다.