OOP & JAVA

[JAVA Collection 1] ArrayList 와 LinkedList 의 차이

쉽코기 2021. 6. 3. 16:33

1. Collection 구조

  • List 인터페이스 구현체로는 ArrayList , Vector , Stack 이 있다,
  • LinkedList 는 List 인터페이스와 Queue 인터페이스를 구현한 Deque 인터페이스의 구현체이다.

 

 

2.  ArrayList 란?

  • 중복을 허용한다
  • 순서를 유지하며 인덱스로 원소를 관리한다
  • 배열과 다르게 그 용량이 정해져있지 않다

List 인터페이스 만을 구현하는 ArrayLsit 는 내부적으로 자료를 배열 형태로 저장합니다. 배열과의 차이로는 배열은 최초 생성시 용량이 정해져있는데 반해 ArrayList는 크기가 가변적이라는 것입니다.

 

사실 ArrayList 도 내부적으로는 생성시 최대 용량이 정해져있고(10으로 고정) 해당 용량을 초과할시 새로운 배열로 옮기게 되어 있습니다.

 

3. LinkedList 란?

: 링크드리스트는 양방향의 연결 리스트로 구성되어 있는 자료구조 형태입니다.  이에따라 앞에서부터 혹은 뒤에서부터 순회하여 원소를 찾아내야하지만 데이터의 추가 삭제에 있어서 큰 이점을 보입니다.

 

 

4. ArrayList vs LinkedList 

위의 특징들을 종합하여 비교해보았을때

 

ArrayList 는 인덱스로 접근하기에 조회에 있어 빠르지만 추가/삭제시 새로운 배열을 생성하고 옮기는 과정을 거치기에비효율적인 면이 있습니다

 

반면 LinkedList 는 순차적인 조회로 인해 조회가 느리지만 추가 삭제시 새로운 배열로 옮기는 과정이 필요가 없기 때문에 빠르게 추가하고 삭제할 수 있는 이점을 가집니다. 만약 순회하면서 추가 삭제를 진행한다면 매우 좋은 선택일 것입니다

 

클래스 조회 추가 / 삭제  기타
ArrayList 빠르다 느리다 순차적인 추가 삭제는 더 빠름 , 비효율적인 메모리사용
LinkedList 느리다 빠르다 데이터가 많아질 수록 접근성이 떨어짐

 

5. 시간복잡도의 비교

 

😀😀질문 : 맨앞 혹은 맨뒤가 아닌 가운데 값에 대한 추가 / 삭제에도 LinkedList 가 ArrayList 에 시간복잡도적 이점이 있을까?

 

시간복잡도 관점에서는 둘다 O(n) 으로 같게 됩니다.

실질적 LinkedList 가 doubly로 구현 되어 있으므로 앞뒤로 접근하여 속도적인 차이가 있을 수 있겠지만

 

linkedList 는 해당 위치까지 찾아가는데 O(n) , 추가 / 삭제시 O(1)로 최종적으로 O(n)이고

ArrayList 는 해당 위치 접근 O(1) , 추가 / 삭제시 배열의 앞의 원소를 두고 뒤에 원소들을 한개씩 연산하는 과정을 통해 O(n)으로 같은 O(n) 의 시간복잡도를 갖습니다.