JAVA/JAVA
Java | List_ArrayList & LinkedList & Vector
pathas
2020. 2. 8. 17:39
List
순차적인 자료를 관리하는 데 사용하는 인터페이스
요소의 중복을 허용함
ArrayList
객체 배열을 구현한 클래스
컬렉션 인터페이스와 리스트 인터페이스를 구현객체 순서를 기반으로 순차적으로 자료를 관리하는 프로그램 구현시 사용
- 요소의 개수에 따라 ArrayList의 크기가 자동으로 조정됨
- 배열의 0번 인덱스부터 순서대로 요소가 저장됨
- 동기화가 제공되지 않음
- 내부적으로 데이터를 배열에서 관리하며 데이터 추가/삭제시 임시 배열을 생성해서 데이터를 복사함
- 대량의 자료를 추가/삭제하는 경우 그만큼 데이터 복사가 일어나기 때문에 성능이 저하될 수 있음
- 요소마다 인덱스를 가지고 있기 때문에 데이터 검색시에는 유리함
ArrayList 생성
ArrayList<E> 배열 이름 = new ArrayList<E>();
※ E: 제너릭 자료형, 해당 자료형의 데이터만 저장될 수 있도록 지정
ArrayList 메소드
메소드 | 설명 |
---|---|
boolean add(E e) | 요소 하나를 배열에 추가, E는 요소의 자료형을 의미함 |
void add(int index, E element) | 배열의 index 위치에 element 요소 삽입 |
int size() | 배열에 저장된 요소의 전체 개수 반환 |
E get(int index) | index 위치의 요소 값 반환 |
E set(int index, E element) | index 위치의 요소 값을 element로 대체 |
E remove(int index) | 배열의 index 위치에 있는 요소 값 제거 후 해당 값 반환 |
boolean isEmpty() | 배열이 비어 있는지 확인, 비어있다면 true 반환 |
예제
package j200207;
import java.util.*;
public class ArrayListTest {
public static void main(String[] args) {
// List 구조 내부에 배열이 저장된 구조, 인덱스번호로 구분
// String 형의 자료만 저장 가능
ArrayList<String> list = new ArrayList<String>();
// add(element), list 배열에 값 입력
// 추가한 데이터는 앞에서부터 순서대로 저장됨
list.add("포도");
list.add("딸기");
System.out.println(list); // [포도, 딸기]
// add(index, element), index 1에 "키위" 값 삽입
list.add(1, "키위");
System.out.println(list); // [포도, 키위, 딸기]
// set(index, element), index 0의 요소를 "복숭아"로 변경
list.set(0, "복숭아");
System.out.println(list); // [복숭아, 키위, 딸기]
// remove(index), index 2의 요소 삭제
list.remove(2);
System.out.println(list); // [복숭아, 키위]
// size(), list 내의 요소 개수 반환
System.out.println(list.size()); // 2
// get(index), index 위치의 값 반환
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 확장 for문 사용 가능
for (String s : list) {
System.out.println(s);
}
/*
복숭아
키위
*/
}
}
LinkedList
LinkedList에 저장된 각 요소가 다음 요소의 주소 값을 가지는 배열 구조
ArrayList와의 차이
- 데이터 추가/삭제시 불필요한 데이터 복사가 없기 때문에 데이터 추가/삭제시 유리
∵ 이전 요소에서 가르킬 다음 요소의 주소 값만 변경하면 되기 때문 - 데이터 검색시에는 처음부터 요소를 순회해야 하기 때문에 검색시에는 불리
LinkedList 메소드
메소드 | 설명 |
---|---|
void addFrist(E element) | element를 리스트의 가장 앞에 삽입 |
E removeLast() | 리스트 가장 마지막 요소를 삭제하고 반환 |
※ 기본적인 메소드의 이름 및 기능은 ArrayList와 동일
Vector
ArrayList처럼 배열을 구현한 클래스
멀티스레드 환경이 아니라면 ArrayList 사용을 권장
ArrayList와의 차이
- Vector는 동기화를 지원함
- 메모리를 많이 차지함
- 불러오는 속도가 더 느림
Vector 메소드
메소드 | 설명 |
---|---|
boolean add(E e) | Element(요소)를 벡터의 끝에 추가함 |
void addElement(E obj) | 특정 객체를 벡터의 끝에 추가함 |
E elementAt(int index) | 해당 인덱스의 요소를 반환함 List 인터페이스의 get(int) 메소드와 기능적으로 동일함 |
void insertElement(E obj, int index) | 해당 인덱스에 obj 요소를 삽입, 원래 해당 인덱스에 있던 값부터 인덱스가 뒤로 하나씩 밀림 |
void setElement(E obj, int index) | 해당 인덱스의 요소를 obj로 대체함(set) |
List 컬렉션을 구현한 리스트 클래스들에 대해 알아보았습니다.
기본적인 구조는 비슷하지만 각 클래스마다 효율적으로 쓰일 수 있는 곳이 다르기 때문에
클래스별 특성에 대해서는 알아두는 것이 좋을 것 같습니다.
데이터를 검색할 필요가 있을 때는 ArrayList, 데이터를 저장하고 추가/삭제를 주로 하는 경우에는 LinkedList,
멀티스레드 환경에서는 Vector를 사용하는 것이 적합하다고 할 수 있습니다.