중복 O
저장순서 유지 O
list<String> list = ...;
list.add("홍길동"); // 맨 끝에 객체 추가
list.remove(0); // 인덱스로 객체 삭제
list.remove("신용권") // 객체 삭제
...
기존의 Vector를 개선한 것
Vector vs ArrayList
- 공통점
- 동적 배열을 제공
- 표준 배열보다 느리지만
- 많은 움직임이 필요한 프로그램에서 유용
- 차이점
- 동기화가 된다 (Vector 의 특징)
- 멀티 스레드가
동시에 Vector의 메소드들을 실행 X
참고: 운영체제 (OS) - (3) 동시성 문제
불연속적으로 존재하는 데이터를 서로 연결(Link)한 형태
각 요소(node)들은 자신과 연결
각 요소(node)들은 다음 요소에 대한 참조(주소값)와 데이터로 구성
배열의 단점을 보완한 자료구조
List 인터페이스와 Deque 인터페이스를 둘다 구현
class GFG {
public static void main(String[] args) {
// LinkedList 선언
LinkedList<Integer> ll = new LinkedList<Integer>();
// 값 입력
for (int i = 1; i <= 5; i++)
ll.add(i);
// 결과 출력
System.out.println(ll);
// 3번 데이터 삭제
ll.remove(3);
// 결과 출력
System.out.println(ll);
// 결과를 하나씩 출력
for (int i = 0; i < ll.size(); i++)
System.out.print(ll.get(i) + " ");
}
}
/* 출력 결과
[1, 2, 3, 4, 5]
[1, 2, 3, 5]
1 2 3 5 */
새로운 데이터 생성
추가할 위치의 이전 요소의 참조 -> 새로운 요소의 참조로 변경
새로운 요소가 그 다음 요소를 참조하도록 변경
개발자 면접에서 자주 나오는 질문 중의 하나!
(Array 와 ArrayList 는 고정 길이인가 아닌가의 차이)
읽기 (검색)
삽입 / 삭제
읽기 (검색)
삽입 / 삭제
다루는 데이터의 개수가 고정적
일 경우에 사용!
읽기 (접근 시간) : Fast ↑
추가 / 삭제 : Slow ↓
다루는 데이터의 개수가 변동이 많을
경우에 사용!
읽기 (접근 시간) : Slow ↓
추가 / 삭제 : Fast ↑
메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 담아둔다. (요소가 연속된 위치에 저장되지 않고, 모든 요소가 데이터 부분과 주소 부분이 있는 별도의 객체에 저장됨)
단, 데이터 多수록, 접근성 ↓
Stack에 대한 내용 + Stack과 Queue의 비교
참고: 'Stack vs Queue' & 'LIFO(후입선출) vs FIFO(선입선출)'