프로그래밍 언어/자바

ArrayList, LinkedList, Vector 차이

hyeseong-dev 2024. 4. 22. 14:00

ArrayList, Vector, LinkedList는 모두 자바에서 제공하는 컬렉션 프레임워크의 일부인 동적 리스트 구현입니다. 각 컬렉션은 고유한 특징과 장단점이 있습니다.

ArrayList:

  • ArrayList는 동적 배열을 구현합니다. 즉, 요소를 추가하거나 제거함에 따라 크기가 동적으로 변화합니다.
  • ArrayList는 고정 크기 배열을 사용하여 요소를 저장합니다. 요소를 추가하거나 제거할 때 필요한 경우 새로운 배열로 복사하는 "복사-기존-수정" 전략을 사용합니다.
  • ArrayList는 임의 접근(random access)을 지원합니다. 즉, 인덱스를 사용하여 특정 요소에 빠르게 접근할 수 있습니다. O(1)의 시간 복잡도를 가집니다.
  • ArrayList는 요소를 삽입하거나 제거하는 작업이 비용이 많이 들 수 있습니다. 특히 배열의 용량이 가득 찬 경우 새로운 배열로 복사하는 과정이 필요합니다.
  • ArrayList는 요소를 검색하는 작업이 효율적입니다. 인덱스를 사용하여 직접 접근할 수 있으므로 O(1)의 시간 복잡도를 가집니다.
  • ArrayList는 요소를 정렬된 순서로 유지하지 않습니다. 요소를 추가하거나 제거함에 따라 인덱스가 변경될 수 있습니다.

Vector:

  • Vector는 ArrayList와 유사하지만, 멀티 스레드 환경에서 안전하도록 동기화(synchronized)된 컬렉션입니다. 즉, 여러 스레드가 동시에 Vector를 수정하더라도 데이터 일관성이 보장됩니다.
  • Vector는 동적 배열을 사용하여 요소를 저장합니다. 요소를 추가하거나 제거할 때 항상 새로운 배열로 복사하는 "복사-기존-수정" 전략을 사용합니다.
  • Vector는 임의 접근(random access)을 지원합니다. 인덱스를 사용하여 특정 요소에 빠르게 접근할 수 있습니다. O(1)의 시간 복잡도를 가집니다.
  • Vector는 요소를 삽입하거나 제거하는 작업이 비용이 많이 들 수 있습니다. 항상 새로운 배열로 복사하는 과정이 필요합니다.
  • Vector는 요소를 검색하는 작업이 효율적입니다. 인덱스를 사용하여 직접 접근할 수 있으므로 O(1)의 시간 복잡도를 가집니다.
  • Vector는 요소를 정렬된 순서로 유지하지 않습니다. 요소를 추가하거나 제거함에 따라 인덱스가 변경될 수 있습니다.

LinkedList:

  • LinkedList는 연결 리스트(linked list)를 구현합니다. 즉, 요소를 노드(node)로 연결하여 관리합니다.
  • LinkedList는 동적 크기 조정이 가능합니다. 요소를 추가하거나 제거함에 따라 노드 연결을 변경합니다.
  • LinkedList는 임의 접근(random access)을 지원하지 않습니다. 특정 요소에 접근하려면 노드를 따라 순회해야 하므로 O(n)의 시간 복잡도를 가집니다.
  • LinkedList는 요소를 삽입하거나 제거하는 작업이 효율적입니다. 노드 연결만 변경하면 되므로 O(1)의 시간 복잡도를 가집니다.
  • LinkedList는 요소를 검색하는 작업이 비용이 많이 들 수 있습니다. 노드를 따라 순회해야 하므로 O(n)의 시간 복잡도를 가집니다.
  • LinkedList는 요소를 정렬된 순서로 유지하지 않습니다. 요소를 추가하거나 제거함에 따라 노드 연결이 변경될 수 있습니다.
주제 ArrayList LinkedList Vector
동기화 없음 없음 있음
임의 접근 허용 허용 안 함 허용
메모리 위치 연속 연속 아님 연속
null 값 지원 지원 지원
데이터 구조 동적 배열 양방향 연결 리스트 동적 배열
중복 허용
삽입 및 삭제 느림 빠름 느림

위 표는 ArrayList, LinkedList, Vector의 차이점을 요약한 것입니다. 각 컬렉션은 고유한 특징과 장단점이 있습니다.

요약하면, ArrayList와 Vector는 동적 배열을 구현하며 임의 접근을 지원하지만 삽입 및 제거 작업에 비용이 많이 들 수 있습니다. 반면, LinkedList는 연결 리스트를 구현하며 임의 접근을 지원하지 않지만 삽입 및 제거 작업이 효율적입니다. 각 컬렉션은 특정 사용 사례와 요구 사항에 따라 적합합니다.