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를 선택하면 됩니다.