본문 바로가기

JAVA

ArrayList vs LinkedList

ArrayList

- 배열을 이용하여 만든 리스트

- 데이터의 저장 순서가 유지되고 중복을 허용

- 데이터량에 따라 공간이 자동으로 늘어나거나 줄어들음 (현재 배열의 크기가 부족하다면, 더 큰 크기의 새로운 배열을 할당하고 기존의 요소들을 새 배열로 복사한다.)

- 단방향 포인터 구조로 자료에 대한 순차적인 접근에 강점이 있어 조회가 빠르다.

- 삭제/삽입이 느리다는 단점이 있다. 단, 순차적으로 삭제/삽입하는 경우에는 가장 빠르다.

 

LinkedList

- 노드(객체)를 연결하여 리스트처럼 만든 컬렉션(배열이 아님)

- 각 요소는 데이터와 다음 요소를 가리키는 포인터로 구성. 연결 리스트는 각 노드가 데이터와 다음 노드를 가리키는 링크로 이루어진 구조

- 데이터의 중간 삽입, 삭제가 빈번할 경우 빠른 성능을 보장한다.

- 임의의 요소에 대한 접근 성능은 좋지 않다.

- 자바의 LinkedList 는 양방향 포인터 구조로 이루어져 있다.

- ArrayList 가 배열을 이용하여 요소를 저장함으로써 발생하는 단점을 극복하기 위해 고안

 

ArrayList의 문제점

- 배열 공간이 꽉 차거나, 요소 중간에 삽입을 행하려 할 때 기존의 배열을 복사해서 요소를 뒤로 한 칸씩 일일이 이동해야 하는 작업이 필요

- 삽입/삭제가 빈번하게 발생하는 프로세스의 경우 시스템 성능 저하로 이어질 수 있다.

- 자료들이 지속적으로 삭제되는 과정에서 ArrayList 에서는 그 공간만큼 낭비되는 메모리가 많아지게 되고 리사이징 처리에서 시간이 소모된다.

 

LinkedList의 장단점

장점

- LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있기 때문에 공간의 제약이 존재하지 않는다.

- 또한 삽입의 경우 노드가 가리키는 포인터만 바꿔주면 되기 때문에 배열처럼 데이터를 이동하기 위해 복사하는 과정이 없어 삽입/삭제의 속도가 빠르다.

단점

- ArrayList 는 무작위 접근이 가능하지만(자료를 연속적인 묶음으로 묶어 저장) LinkedList는 순차접근만(저장 공간에 불연속적인 단위로 저장)이 가능하기 때문에 특정 자료의 탐색 시간이 많이 소요된다.

- 참조자를 위해 추가적인 메모리 할당이 필요하다.

 

ArrayList vs LinkedList 시간 복잡도

작업 메소드 ArrayList LinkedList
add at last index add() O(1) O(1)
add at given index add(index, value) O(N) O(1)
remove by index remove(index) O(N) O(1)
remove by value remove(value) O(N) O(1)
get by index get(index) O(1) O(N)
search by value indexOf(value) O(N) O(N)

'JAVA' 카테고리의 다른 글

자바 HashMap  (0) 2023.12.30
자바의 정석 - 7장 객체 지향 언어 2  (0) 2022.09.15
자바의 정석 - 6장 객체 지향 언어  (0) 2022.09.14