[Java] ArrayList와 LinkedList 차이 및 활용법
1. ArrayList와 LinkedList란?
Java에서 ArrayList와 LinkedList는 대표적인 리스트(List) 자료구조입니다.
두 컬렉션 클래스는 서로 다른 방식으로 데이터를 저장하며, 특정 연산에서 성능 차이가 발생합니다.
2. ArrayList와 LinkedList 기본 사용법
먼저 두 리스트를 생성하는 기본 코드입니다.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
List arrayList = new ArrayList<>();
List linkedList = new LinkedList<>();
}
}
✅ 위 코드에서는 ArrayList와 LinkedList를 각각 생성했습니다.
3. ArrayList vs LinkedList 비교
비교 항목 | ArrayList | LinkedList |
---|---|---|
데이터 저장 방식 | 배열 기반 (연속된 메모리 공간) | 이중 연결 리스트 (노드 구조) |
데이터 접근 속도 | 빠름 (O(1)) - 인덱스를 통해 직접 접근 | 느림 (O(n)) - 순차 탐색 필요 |
데이터 삽입/삭제 속도 | 느림 (O(n)) - 중간 삽입/삭제 시 요소 이동 필요 | 빠름 (O(1) ~ O(n)) - 노드 포인터 변경만 필요 |
메모리 사용량 | 낮음 - 추가적인 포인터 필요 없음 | 높음 - 각 노드마다 포인터를 저장해야 함 |
4. 성능 테스트 예제
ArrayList와 LinkedList의 데이터 삽입 속도를 비교하는 코드입니다.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class PerformanceTest {
public static void main(String[] args) {
List arrayList = new ArrayList<>();
List linkedList = new LinkedList<>();
long startTime, endTime;
// ArrayList 추가 속도 측정
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
arrayList.add(i);
}
endTime = System.nanoTime();
System.out.println("ArrayList 추가 시간: " + (endTime - startTime) + " ns");
// LinkedList 추가 속도 측정
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
linkedList.add(i);
}
endTime = System.nanoTime();
System.out.println("LinkedList 추가 시간: " + (endTime - startTime) + " ns");
}
}
5. ArrayList가 유리한 경우
- 데이터 접근이 빈번한 경우 (인덱스를 통한 빠른 조회)
- 메모리 사용량을 줄이고 싶을 때
- 중간 삽입/삭제가 적고, 주로 데이터를 추가하고 읽는 경우
6. LinkedList가 유리한 경우
- 중간 삽입/삭제가 빈번한 경우
- 데이터 크기가 클 때 (메모리 조각화를 방지 가능)
- 메모리 재할당 없이 리스트 크기를 유동적으로 관리할 때
7. 최종 정리
상황 | 추천 컬렉션 |
---|---|
빠른 데이터 조회가 필요할 때 | ArrayList |
중간 삽입/삭제가 많을 때 | LinkedList |
메모리를 효율적으로 사용하고 싶을 때 | ArrayList |
데이터 구조 변경이 많을 때 | LinkedList |
8. 결론
ArrayList와 LinkedList는 각각의 장점과 단점이 있으며, 상황에 맞게 적절한 컬렉션을 선택해야 합니다.
일반적인 경우에는 ArrayList가 더 효율적이며, 삽입/삭제가 많다면 LinkedList를 고려하는 것이 좋습니다.
🔗 다른 Java 관련 글도 함께 확인해보세요!
'Java 오류 & 개발 > Java 기본 문법 & 오류' 카테고리의 다른 글
[Java 기본 문법 & 오류] Java 인터페이스(Interface)와 추상 클래스(Abstract Class) 비교 (0) | 2025.03.17 |
---|---|
[Java] Java의 메모리 관리: Stack vs Heap 개념과 차이점 (1) | 2025.03.14 |
[Java 기본 문법 & 오류] Java Optional 사용법 및 활용 사례 (1) | 2025.03.14 |
[Java] String, StringBuilder, StringBuffer 차이점과 성능 비교 (1) | 2025.03.13 |
[Java] Optional 클래스 활용법 및 NullPointerException 방지하기 (0) | 2025.03.13 |