Backend/Java
Java - ArrayList, LinkedList 비교
chillmyh
2023. 11. 27. 18:58
| |
ArrayList |
LinkedList |
| 장점 |
- 빠른 임의 접근: 인덱스를 이용한 원소 접근 및 검색이 빠릅니다. get() 메서드를 사용하여 특정 인덱스의 원소에 빠르게 접근할 수 있습니다.
- 저장 및 읽기가 빠름: 내부적으로 배열을 사용하기 때문에 요소들을 메모리에 연속적으로 저장합니다.
- 적은 메모리 사용: 요소들을 저장하는 데에 필요한 추가적인 포인터나 노드를 사용하지 않아 메모리를 적게 사용합니다.
|
- 요소 삽입 및 삭제가 빠름: 요소를 삽입하거나 삭제할 때 add() 및 remove() 메서드의 성능이 좋습니다. 리스트의 시작 또는 끝에 요소를 추가하거나 삭제할 때는 더욱 빠릅니다.
- 메모리의 동적 사용: 요소를 추가하거나 삭제할 때마다 새로운 노드를 할당하여 메모리를 유연하게 사용합니다.
|
| 단점 |
- 요소 삽입 및 삭제가 느림: 요소를 삽입하거나 삭제할 때, 배열의 크기를 조정해야 하며, 이 때문에 요소를 추가하거나 삭제할 때는 해당 위치 뒤의 모든 요소들을 이동해야 합니다.
- 크기 제한: 배열의 크기를 동적으로 조절할 수 있지만, 크기를 동적으로 변경하기 위해서는 배열을 새로 생성해야 하므로 부하가 발생할 수 있습니다.
|
- 임의 접근이 느림: 특정 인덱스의 원소에 접근할 때 get() 메서드를 이용해야 하며, 이 때문에 임의 접근에 대한 성능이 좋지 않습니다.
- 추가적인 메모리 사용: 각각의 노드에는 다음 요소를 가리키는 포인터가 포함되어 있어 메모리를 더 많이 사용합니다.
|
| 구조 |
ArrayList는 내부적으로 배열을 기반으로 구현됩니다. 요소들은 연속적인 메모리 공간에 저장되며, 동적으로 크기가 조절됩니다. |
LinkedList는 각 요소(Node)가 데이터와 다음 요소를 가리키는 포인터(참조)로 이루어진 노드들의 연결된 구조입니다. |
| 원리 |
- 요소를 추가할 때, 기존 배열의 크기를 초과하는 경우 더 큰 새로운 배열을 생성합니다.
- 요소를 삽입하거나 삭제할 때, 해당 위치 뒤의 모든 요소들을 이동해야 합니다.
- 요소를 읽을 때는 인덱스를 통해 배열 내 특정 위치에 직접 액세스할 수 있어 빠른 임의 접근이 가능합니다.
- 크기를 동적으로 조절할 때 배열을 새로 생성하고 기존 요소를 복사해야 하므로 성능 저하가 발생할 수 있습니다.
|
- 요소를 추가하거나 삭제할 때는 해당 위치의 노드를 조정하여 새로운 노드를 추가하거나 삭제합니다.
- 각 노드는 데이터와 다음 노드를 가리키는 포인터를 가지고 있어, 다음 요소로의 참조가 가능합니다.
- 임의 접근이 느리지만, 요소 삽입 및 삭제가 빠르며 메모리 할당이 유연하여 동적으로 요소를 추가하거나 삭제할 수 있습니다.
- 각 노드가 다음 노드를 가리키는 포인터를 갖기 때문에 순차적인 접근에서 빠른 성능을 보이며, 요소의 추가 및 삭제가 배열보다 효율적입니다.
|
| 사용 이유 |
빠른 임의 접근과 검색이 필요한 경우 요소의 추가나 삭제가 빈번하지 않고, 읽기가 자주 일어나는 경우 |
요소의 추가나 삭제가 빈번하게 일어나는 경우 리스트의 시작이나 끝에서의 요소 추가 및 삭제가 많은 경우 메모리를 더 적게 사용하는 것보다 동적 메모리 할당이 우선시되는 경우 |
ArrayList vs LinkedList
- ArrayList: 배열 기반이기 때문에 인덱스를 통한 빠른 접근이 가능하지만, 요소의 삽입 및 삭제가 비효율적입니다.
(접근성up, 삽입삭제 down)
- LinkedList: 각 요소를 노드로 연결하여 삽입 및 삭제가 용이하지만, 임의 접근에는 불리합니다.
(접근성down, 삽입삭제 up)
요약:
- ArrayList는 배열 기반이기 때문에 인덱스를 통한 빠른 접근이 가능하지만, 요소의 삽입 및 삭제가 비효율적입니다.
- LinkedList는 각 요소를 노드로 연결하여 삽입 및 삭제가 용이하지만, 임의 접근에는 불리합니다.
따라서, 사용하고자 하는 목적에 따라 데이터의 접근 패턴과 삽입/삭제의 빈도에 따라 ArrayList 또는 LinkedList를 선택하면 됩니다.