List 컬렉션의 특징 및 주요 메소드
특징
인덱스로 관리
중복해서 객체 저장 기능
구현 클래스
ArrayList
Vector
LinkedList
주요 메소드
기능 |
메소드 |
설명 |
객체 추가
|
boolean add(E e) |
주어진 객체를 맨 끝에 추가 |
void add(int index, E element) |
주어진 인덱스에 객체를 추가 |
|
set(int index, E element) |
주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈 |
|
객체 검색 |
boolean contains(Object o) |
주어진 객체가 저장되어 있는지 여부 |
E get(int index) * |
주어진 인덱스에 저장된 객체를 리턴 |
|
isEmpty() |
컬렉션이 비어 있는지 조사 |
|
int size() * |
저장되어있는 전체 객체수를 리턴 |
|
객체 삭제 |
void clear() |
저장된 모든 객체를 삭제 |
E remove(int index) |
주어진 인덱스에 저장된 객체를 삭제 |
|
boolean remove(Object o) |
주어진 객체를 삭제 |
객체 추가, 찾기, 삭제
Exam
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("김나박"); //맨끝에 객체 추가
list.add("박효신"); //맨끝에 객체 추가
list.add(0, "홍길동"); //저장된 인덱스에 객체 삽입
String index1 = list.get(1); //인덱스로 객체 찾기
System.out.println("index1 = " + index1); //출력
System.out.println(); //공백
//list를 반복하며 객체를 꺼내서 출력
for (int i = 0; i < list.size(); i++) {
System.out.println("list.get(" + i + ") = " + list.get(i));
}
System.out.println(list.size()); //리스트의 사이즈
System.out.println(); //공백
list.remove(0); //인덱스로 객체삭제
list.remove("김나박"); // 객체 삭제
//list를 반복하며 객체를 꺼내서 출력
for (int i = 0; i < list.size(); i++) {
System.out.println("list.get(" + i + ") = " + list.get(i));
}
System.out.println(list.size()); //리스트의 사이즈
}
}//결과
index1 = 김나박 list.get(0) = 홍길동 list.get(1) = 김나박 list.get(2) = 박효신 3 list.get(0) = 박효신 1
ArrayList
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
|
|
|
|
|
|
|
|
|
저장 용량 (capacity)
초기 : 10
초기 용량 지정 가능 List<E> list = new ArrayList<E>(30); 30개의 배열
저장 용량을 초과한 객체들이 들어오면 자동적으로 늘어난다.
객체 제거
바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.
0 |
1 | 2 |
1번 삭제시-> |
0 | 1 | ||
|
|
|
Exam
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("JDBC");
list.add("Servlet/JSP");
list.add(2, "DataBase");
list.add("iBATIS");
int size = list.size();
System.out.println("총 객체수 = " + size);
System.out.println();
String skill = list.get(2);
System.out.println("2: " + skill);
System.out.println();
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ": " + str);
}
System.out.println();
list.remove(2); //삭제
list.remove(2); //삭제
list.remove("iBATIS"); //삭제
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ": " + str);
}
System.out.println();
}
} 결과 총 객체수 = 5 2: DataBase 0: Java 1: JDBC 2: DataBase 3: Servlet/JSP 4: iBATIS 0: Java 1: JDBC
고정된 객체들로 구성된 List 생성
Exam
import java.util.Arrays;
import java.util.List;
public class ArraysAsListExample {
public static void main(String[] args) {
List<String> list1 = Arrays.asList("김나박", "김범수", "박효신");
for (String name : list1) {
System.out.println("name = " + name);
}
List<Integer> list2 = Arrays.asList(new Integer(1), 2, 3);
for (int value : list2) {
System.out.println("value = " + value);
}
}
} 결과 name = 김나박 name = 김범수 name = 박효신 integer = 1 integer = 2 integer = 3
Vector
특징
Vector는 스레드 동기화(synchronization)가 되어 있기 때문에
복수의 스레드가 동시에 Vecctor에 접근해서 객체를 추가, 삭제하더라도 스레드에 안전(thread safe)하다.
Exam
import java.util.List;
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
List<Board> list = new Vector<>();
list.add(new Board("제목1", "내용1", "글쓴이1"));
list.add(new Board("제목2", "내용2", "글쓴이2"));
list.add(new Board("제목3", "내용3", "글쓴이3"));
list.add(new Board("제목4", "내용4", "글쓴이4"));
list.add(new Board("제목5", "내용5", "글쓴이5"));
list.remove(2);
list.remove(3);
for (int i = 0; i < list.size(); i++) {
Board board = list.get(i);
System.out.println(board.subject + "\t" + board.content + "\t" + board.writer);
}
}
} 결과 제목1 내용1 글쓴이1 제목2 내용2 글쓴이2 제목4 내용4 글쓴이4
LinkedList
특징
인접 참조를 링크해서 체인처럼 관리
특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞뒤 링크만 변경
빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 좋은 성능 발휘
Exam
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
List<String > list1 = new ArrayList<>();
List<String > list2 = new LinkedList<>();
long startTime;
long endTime;
//특정위치에 데이터를 10000번 삽입시간 차이
//ArrayList
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list1.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("ArrayList 걸린 시간: " + (endTime-startTime) + " ns");
//LinkedList
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list2.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("LinkedList 걸린 시간: " + (endTime-startTime) + " ns");
} }결과
ArrayList 걸린 시간: 22325130 ns LinkedList 걸린 시간: 3664420 ns