bfs, dfs 문제 풀이를 하며 다른 사람들의 풀이를 보고 있는데, 큐를 구현할 때 어떤 사람은 ArrayDeque
를, 어떤 사람은 LinkedList
를 사용하는 것을 보았다. 이 둘은 어떤 차이가 있을까?
ArrayDeque
는 Queue
의 서브인터페이스인 Deque
의 구현체이고, LinkedList
는 List
와 Queue
의 구현체이다. 따라서 LinkedList
는 List의 특징을 가지고 있고, ArrayDeque은 배열의 특성을 가지고 있다고 할 수 있다. 이것을 기억하고 아래의 차이점들을 살펴보자.
ArrayDeque
을 배열의 측면에서 바라봤을 때, deque의 양끝에서 삽입/삭제 연산이 일어날 경우 시간 복잡도가 O(1)이므로 삽입/삭제 성능이 우수하다. 또한 Random access가 가능하기에 원소 조회 시에도 속도가 빠르다. LinkedList
도 삽입/삭제 연산 성능이 좋지만, 특정 원소에 접근 시의 성능은 ArrayDeque
에 비해 떨어진다.
또한 ArrayDeque
는 LinkedList에 비해 cache-locality에 더 친숙하여 연산 속도가 더 빠르다.
ArrayDeque
은 LinkedList
와 달리 다음 노드에 대한 참조를 유지할 필요가 없기 때문에 더 적은 메모리를 사용한다.
이런 차이점 때문에 큐 구현 시 ArrayDeque가 LinkedList보다 속도와 메모리 측면에서 더 효율적이라고 할 수 있으며, 이는 자바 공식문서에도 언급되어있다.
"This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue."
이외에도 다음과 같은 차이점들이 있다.
ArrayDeque
은 크기 조정이 가능하다.ArrayDeque
은 null을 요소로 추가할 수 없지만 LinkedList
는 null을 추가할 수 있다.
좋은 글 잘 읽고 갑니다!!