- 배열과 비슷하게 객체를 인덱스로 관리한다.
- 배열과 차이점은 저장 용량이 자동으로 증가하며, 객체를 저장할 때 자동 인덱스가 부여된다는 점이다.
추가
,삭제
,검색
을 위한 다양한 메소드가 제공 된다.- 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조한다. 때문에 동일한 객체를 중복 저장할 수 있다. 이 경우 동일한 번지가 참조된다.
null
도 저장 가능하며, 이 경우 인덱스는 객체를 참조하지 않는다.
[ List 인터페이스에서 공통적으로 사용하는 메소드 ]
기능 | 메소드 | 설명 |
---|---|---|
객체 추가 | boolean add(E e) | 주어진 객체를 맨 끝에 추가 |
void add(int index, E element) | 주어진 인덱스에 객체 추가 | |
E set(int undex, E element) | 주어진 인데스에 저장된 객체를 주어진 객체로 바꿈 | |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 조사 |
E get(int index) | 주어진 인덱스에 저장된 객체를 리턴 | |
boolean isEmpty() | 컬렉션이 비어 있는지 조사 | |
int size() | 저장되어 있는 전체 객체 수 리턴 | |
객체 삭제 | void clear() | 저장된 모든 객체 삭제 |
E remove(int index) | 주어진 인덱스에 저장된 객체를 삭제 | |
boolean remove(Object o) | 주어진 객체를 삭제 |
// String 객체를 저장하는 ArrayList 생성
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("JDBC");
list.add("Servlet/JSP");
list.add(2, "Database");
list.add("iBATIS");
System.out.println("총 객체수: " + list.size());
System.out.println(list.contains("JDBC"));
System.out.println("2: " + list.get(2));
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ":" + str);
}
list.remove(2); // 2번 인덱스 "Database" 삭제
list.remove(2); // 2번 인덱스 "Servlet/JSP" 삭제
list.remove("iBATIS");
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ":" + str);
}
총 객체수: 5
true
2: Database
0:Java
1:JDBC
2:Database
3:Servlet/JSP
4:iBATIS
0:Java
1:JDBC
- 인덱스를 이용해 객체를 찾거나, 맨 마지막에 객체를 추가하는 경우 사용
- 중간 인덱스의 객체를 제거하면 뒤에 있는 객체의 인덱스가 1씩 앞당겨 진다.
List<E> list = new ArrayList<E>();
List<E> list = new ArrayList<>();
ArrayList
와 동일한 내부 구조를 가진다.- 차이점은
Vector
는 동기화(synchronized)된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에Vector
의 메소드를 실행할 수 없고, 하나의 스레드가 메소드 실행을 완료해야만 다른 스레드가 메소드를 실행할 수 있다.- 따라서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제 할 수 있다 (Thread safe 하다고 표현)
- 동기화 되어있기 때문에
ArrayList
보다는 객체를 추가, 삭제하는 과정은 느리다. 안정성을 추구하고, 속도를 포기한 트레이드 오프(trade off)이다.
List<E> list = new Vector<E>();
List<E> list = new Vector<>();
ArrayList
에는 내부 배열에 객체를 저장해서 인덱스로 관리하지만,LinkedList
는 인접 참조를 링크해서 체인처럼 관리 한다.- 따라서 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경된다.
- 빈번한 객체 삭제와 삽입이 일어나는 곳에서는
ArrayList
사용 보다는LinkedList
사용이 더 좋은 성능 발휘
List<E> list = new LinkedList<E>();
List<E> list = new LinkedList<>();
구분 | 순차적 추가/삭제 | 중간 추가/삭제 | 검색 |
---|---|---|---|
ArrayList | 빠르다 | 느리다 | 빠르다 |
LinkedList | 느리다 | 빠르다 | 느리다 |
List 컬렉션을 정리하면서 궁금증이 생겼던, 아래 둘의 차이를 정리해 보았다.
List<E> list = new ArrayList<>();
ArrayList<E> list = new ArrayList<>();
List
는 인터페이스 이고, ArrayList
는 클래스 이다.
List를 도형, ArrayList는 정사각형이라고 비유한다면,
List
로 선언하면 여러 도형들(ArrayList,LinkedList)로 바꿀 수 있고,
ArrayList
로 선언하면 정사각형(ArrayList)로만 사용할 수 있다.