Collection: List
Array처럼 크기를 고정하여 생성하는 것을 정적 배열.
ArrayList처럼 크기가 가변적으로 늘어나는 것을 동적 배열이라고 합니다.
ArrayList 특징
동적 크기 조정: ArrayList는 내부적으로 배열을 사용하지만, 크기가 동적으로 조정된다. 요소를 추가할 때 배열의 크기가 부족하면, 새로운 배열을 할당하고 기존 요소를 복사하여 저장한다.
빠른 요소 접근: 인덱스를 사용하여 요소에 접근하는 연산은 O(1) 시간복잡도를 가진다. 이는 ArrayList의 큰 장점 중 하나이다.
요소 추가와 제거: 배열의 크기를 동적으로 조정해야 하는 경우를 제외하면, 끝에 요소를 추가하는 연산은 평균적으로 O(1) 시간복잡도를 가진다. 그러나 중간에 요소를 삽입하거나 제거하는 연산은 O(n) 시간복잡도를 가진다.
비동기성: ArrayList는 동기화되지 않기 때문에, 멀티스레드 환경에서는 외부에서 동기화 메커니즘을 제공해야 한다.
ArrayList 클래스의 생성자
- 기본 생성자:기본 생성자는 초기 용량이 10인 빈 리스트를 생성한다.
ArrayList<E> list = new ArrayList<>();
- 초기 용량을 지정하는 생성자:초기 용량을 지정하여 리스트를 생성할 수 있다.
ArrayList<E> list = new ArrayList<>(int initialCapacity);
- 다른 컬렉션을 복사하는 생성자:지정된 컬렉션의 요소를 포함하는 리스트를 생성한다.
주요 메서드
요소 추가
add(E e): 리스트의 끝에 요소를 추가한다.
add(int index, E element): 지정된 위치에 요소를 삽입한다.
list.add(1, "Banana");
요소 접근
get(int index): 지정된 위치의 요소를 반환한다.
set(int index, E element): 지정된 위치의 요소를 변경한다.
요소 제거
remove(int index): 지정된 위치의 요소를 제거한다.
remove(Object o): 지정된 요소를 제거한다.
기타 메서드
size(): 리스트의 요소 개수를 반환한다.
clear(): 리스트의 모든 요소를 제거한다.
contains(Object o): 리스트에 지정된 요소가 포함되어 있는지 확인한다.
isEmpty(): 리스트가 비어 있는지 확인한다.
indexOf(Object o): 지정된 요소의 첫 번째 인덱스를 반환한다.
lastIndexOf(Object o): 지정된 요소의 마지막 인덱스를 반환한다.
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
// ArrayList 선언 및 초기화
List<String> list = new ArrayList<>();
// 요소 추가
list.add("Apple");
list.add("Banana");
list.add("Cherry");
// 요소 접근
System.out.println("첫 번째 요소: " + list.get(0));
// 요소 변경
list.set(0, "Orange");
// 요소 제거
list.remove("Banana");
// 요소 포함 여부 확인
boolean hasCherry = list.contains("Cherry");
System.out.println("Cherry 포함 여부: " + hasCherry);
// 리스트 크기 확인
int size = list.size();
System.out.println("리스트 크기: " + size);
// 요소 출력
for (String fruit : list) {
System.out.println(fruit);
}
// 리스트 비우기
list.clear();
System.out.println("리스트 비어 있는지 확인: " + list.isEmpty());
}
}
양방향 연결 리스트: LinkedList는 각 요소가 이전 요소와 다음 요소에 대한 참조를 가지는 노드로 구성된다. 이를 통해 요소의 추가 및 제거가 배열 기반 리스트보다 효율적이다.
빠른 요소 추가 및 제거: LinkedList는 요소의 추가와 제거가 O(1) 시간복잡도를 가지므로, 중간에 요소를 삽입하거나 제거하는 작업이 빈번한 경우 적합하다.
느린 요소 접근: 인덱스를 사용하여 요소에 접근하는 연산은 O(n) 시간복잡도를 가지므로, 임의 접근보다는 순차 접근에 더 적합하다.
이중 기능 제공: LinkedList는 List와 Deque 인터페이스를 모두 구현하여 리스트와 덱의 기능을 모두 제공한다.
생성자
LinkedList 클래스에는 두 가지 주요 생성자가 있다.
기본 생성자:빈 리스트를 생성한다.
다른 컬렉션을 복사하는 생성자:지정된 컬렉션의 요소를 포함하는 리스트를 생성한다.
주요 메서드
요소 추가
add(E e): 리스트의 끝에 요소를 추가한다.
add(int index, E element): 지정된 위치에 요소를 삽입한다.
addFirst(E e): 리스트의 처음에 요소를 추가한다.
addLast(E e): 리스트의 끝에 요소를 추가한다.
요소 접근
get(int index): 지정된 위치의 요소를 반환한다.
getFirst(): 리스트의 첫 번째 요소를 반환한다.
getLast(): 리스트의 마지막 요소를 반환한다.
요소 제거
remove(int index): 지정된 위치의 요소를 제거한다.
remove(Object o): 지정된 요소를 제거한다.
removeFirst(): 리스트의 첫 번째 요소를 제거한다.
removeLast(): 리스트의 마지막 요소를 제거한다.
기타 메서드
size(): 리스트의 요소 개수를 반환한다.
clear(): 리스트의 모든 요소를 제거한다.
contains(Object o): 리스트에 지정된 요소가 포함되어 있는지 확인한다.
isEmpty(): 리스트가 비어 있는지 확인한다.
indexOf(Object o): 지정된 요소의 첫 번째 인덱스를 반환한다.
lastIndexOf(Object o): 지정된 요소의 마지막 인덱스를 반환한다.
예제 코드
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
// LinkedList 선언 및 초기화
List<String> list = new LinkedList<>();
// 요소 추가
list.add("Apple");
list.add("Banana");
list.add("Cherry");
// 요소 접근
System.out.println("첫 번째 요소: " + list.get(0));
// 요소 변경
list.set(0, "Orange");
// 요소 제거
list.remove("Banana");
// 요소 포함 여부 확인
boolean hasCherry = list.contains("Cherry");
System.out.println("Cherry 포함 여부: " + hasCherry);
// 리스트 크기 확인
int size = list.size();
System.out.println("리스트 크기: " + size);
// 요소 출력
for (String fruit : list) {
System.out.println(fruit);
}
// 리스트 비우기
list.clear();
System.out.println("리스트 비어 있는지 확인: " + list.isEmpty());
}
}