Java

[ Java ] ArrayList, Vector, LinkedList

구티맨 2020. 9. 22. 11:09

List Interface를 구현하는 ArrayList, Vector, LinkedList에 대해 알아보도록 하겠습니다.

 

3 자료구조에 대한 클래스 계층은 아래 그림과 같습니다. 

 

 

 

ArrayList vs Vector

Vector 는 ArrayList와 거의 동일하며, 유일한 차이점은 동기화(synchronized)입니다.

 

이로 인해 ArrayList 보다는 오버헤드가 더 있습니다.

 

그래서 대부분의 자바 프로그래머들은 ArrayList를 더 많이 사용하고,

 

동기화가 필요한 경우에는 명시적으로 동기화를 구현합니다.

 

ArrayList vs LinkedList

두 자료구조의 시간 복잡도를 살펴보겠습니다.

  ArrayList LinkedList
get() O(1) O(n)
add() O(1) O(1) amortized
remove() O(n) O(n)

 

LinkedList의 get()에서 시간 복잡도가 ArrayList에 비해 느린데,

 

값끼리 서로 링크가 연결되어 있어 이를 따라가서 값을 읽어와야 하기 때문에 O(n)의 시간 복잡도를 가집니다.

 

remove()에서는 두 자료구조가 같은 시간복잡도를 가지지만

 

ArrayList는 첫 번째 값을 삭제 시, 마지막 값을 삭제하는 것보다 더 느리다는 것을 알고 있는 것이 좋습니다.

 

ArrayList는 내부적으로 배열로 이루어져 있기 때문에 첫 번째 값을 삭제하면,

 

그 뒤의 모든 값의 인덱스를 하나씩 당겨줘야 하기 때문입니다.

 

결론

 

시간 복잡도를 봐서는 ArrayList 대신 LinkedList를 굳이 사용할 이유는 없는 것 같습니다.

 

그럼, 동기화의 여부에 따라 ArrayList나 Vector를 선택하여 사용하면 됩니다.