
ArrayList는 List 인터페이스를 구현하는 크기가 조정 가능한 배열 데이터 구조이다.
동적 배열이라고도 하는 크기가 조정가능한 배열로, 요소를 순차적으로 저장하고 요소를 추가하거나 제거함으로써 사이즈를 늘리거나 줄일 수도 있다.
ArrayList.get(i)메소드를 통해 i 인덱스의 요소를 빠르게 검색할 수 있다.List<E> list = new ArrayList<E>();
E: 타입 파라미터
ArrayList를 생성하기 위해선
String을 저장하는 ArrayList는 아래와 같이 생성할수 있다.
public class Main2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
}
}
때문에, 저장된 객체수가 많고 특정 인덱스에 객체를 추가하거나 제거하는 일이 잦다면 LinkedList를 사용하는 것이 적절하다.
하지만, 인덱스를 이용해서 객체를 찾거나 맨 마지막에 객체를 추가하는 경우 ArrayList가 더 좋은 성능을 발휘한다

이점
단점
HEAD 부터 순차적으로 요소에 접근해야함 (이진검색수행 불가능)List<String> list1 = new LinkedList<>();
LinkedList를 생성하기 위해선 저장할 객체 타입을 타입 파라미터 에 표시하고, 기본 생성자를 호출하면 된다.
왜 연결리스트를 사용하나?
Why? 왜? 그래서 언제 ArrayList를 사용하고, 언제 LinkedList를 사용해야 하는가?
ArrayList가 빠르지만, 중간에 추가/삭제하는 경우 앞,뒤 링크 정보만 변경하면 되는 LinkedList가 더 빠르다.public class Main {
public static void main(String[] args) {
List<String> list1 = new LinkedList<>();
List<String> list2 = new ArrayList<>();
long startTime;
long endTime;
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list1.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("LinkedList 걸린시간: " + (endTime - startTime));
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list2.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("ArrayList 걸린시간: " + (endTime - startTime));
}
}
LinkedList 걸린시간: 1312375
ArrayList 걸린시간: 5493250
ArrayList와 LinkedList의 0번 인덱스에 String 객체를 10,000번 추가한 성능을 테스트했다.
실행결과를 보면LinkedList가 훨씬 빠른 성능을 발휘한다.왜?.. LinkedList는 인접 노드 링크의 정보만 변경해주면 돼서 중간에 삽입/삭제 할 경우 빠른데, ArrayList는 뒤쪽 인덱스들을 모두 1씩 증가시키는 시간이 필요하니까.
단일 연결리스트의 각 노드는 다음 노드에 대한 참조를 포함한다. 단일 연결리스트의 순회는 정방향으로 수행된다.

이중 연결 리스트는, 각 노드는 이전 노드와 다음 노드에 대한 참조를 포함한다. 정방향, 역방향 순회 가능하나 → 역방향 참조는 추가적 메모리가 필요함.

Tail
- 연속적 메모리 위치에 저장되지 않는, 선형적인 데이터 구조
- 포인터를 사용해서 연결된다.
- 각 노드는 데이터+포인터(다음 노드를 참조하는) 로 구성 → 각 노드엔 포인터를 위한 별도의 공간 필요
장점
1. 동적인 크기, 삽입/삭제가 용이
2. 미리 공간 할당하지 않아도 됨단점
1. HEAD부터 순차적으로 접근해야함 → 이진 검색 수행 불가능
2. 비효율적인 메모리 사용: 포인터를 위한 별도의 메모리 공간이 필요하기 때문
어떤걸 왜 언제 사용하는가?
1. ArrayList와 달리, 각 요소는 링크형태로 참조 되기때문에 중간에 삭제/삽입이 빈번하게 일어나는 경우 ArrayList보다 훨씬 빠른 성능을 발휘함.
2. ArrayList는 끝에서부터 순차적으로 추가/삭제하는 경우에 사용하는 것이 적절.