[Java] List 컬렉션
List 컬렉션
- 객체를 인덱스를 통해 관리, 검색, 삭제
- List 컬렉션에는 ArrayList ,Vector, LinkedList 등이있는데 List컬렉션에서 공통적으로 사용 가능한 List 인터페이스 메소드는 다음과 같다.
1.ArrayList
- ArrayList는 List 컬렉션에서 가장 많이사용
-List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지(주소)를 저장한다.( 중복저장, null저장 가능 )
-일반 배열과 차이점은 제한 없이 객체를 추가할수 있다.
- 객체를 추가하거나 삭제하면 해당 인덱스 기준으로 밀려나거나 당겨진다.
List<E> list = new ArrayList<E>(); // E에 지정된 타입의 객체만 저장
List<E> list = new ArrayList<>(); // E에 지정된 타입의 객체만 저장
List list = new ArrayList(); // 모든 타입의 객체를 저장
2.Vector
- Vector는 ArrayList와 동일한 내부구조를 가지고있다.
- 차이점은 동기화된 (Synchronized) 메소드로 구성되어 있기 떄문에 멀티 스레드가 동시에 Vector() 메소드를 실행 할 수 없다.
- 그렇기 떄문에 멀티스레드 환경에서는 안전하게 객체를 추가 또는 삭제할 수 있다.
List<E> list = new Vector<E>();
List<E> list = new Vector<>();
List list = new Vector();
[ Vector 예제 ]
package study0530.Collection;
import java.util.List;
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Board> list = new Vector<Board>();
// 작업스레드 객체 생성
Thread threadA = new Thread() {
public void run() {
// 객체 1000개 추가
for (int i = 1; i <= 1000; i++) {
list.add(new Board("제목" + i, "내용" + i, "글쓴이" + i));
}
}
};
// 작업스레드 객체 생성
Thread threadB = new Thread() {
public void run() {
// 객체 1000개 추가
for (int i = 1001; i <= 2000; i++) {
list.add(new Board("제목" + i, "내용" + i, "글쓴이" + i));
}
}
};
// 작업스레드실행
threadA.start();
threadB.start();
// 작업 스레드들이 모두 종료될 때까지 메인 스레드를 기다리게 함
try {
threadA.join();
threadB.join();
} catch (Exception e) {
// TODO: handle exception
}
// 저장된 총 객체 수 얻기
int size = list.size();
System.out.println("총객체수 : " + size);
System.out.println();
}//
}//
3.LinkedList
- LinkedList 는 ArrayList와 사용 방법은 동일하지만 내부 구조는 완전히 다르다.
- ArrayList는 내부 배열에 객체를 저장하지만, LinkedList는 인접 객체를 체인처럼 연결해서 관리한다.
- LinkedList는 특정 위치에서 객체를 삽입하거나 삭제하면 바로 앞뒤 링크만 변경하면 되므로 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 좋은 성능을 발휘한다.
List<E> list = new LinkedList<E>();
List<E> list = new LinkedList<>();
List list = new LinkedList();
[ LinkedList와 ArrayList의 성능 차이를 알아보는 예제 ]
package study0530.Collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
//ArrayList 컬렉션 객체 생성
List<String> list1 = new ArrayList<String>();
//LinkedList 컬렉션 객체 생성
List<String> list2 = new LinkedList<String>();
//시작 시간관 끝 시간을 저장할 변수 선언
long startTime;
long endTime;
//ArrayList 컬렉션에 저장하는 시간 측정
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list1.add(0,String.valueOf(i));
}
endTime = System.nanoTime();
System.out.printf("%-17s %8d ns \n","ArrayList 걸린시간 :", (endTime-startTime));
//LinkedList 컬렉션에 저장하는 시간 측정
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list2.add(0,String.valueOf(i));
}
endTime = System.nanoTime();
System.out.printf("%-17s %8d ns \n","ArrayList 걸린시간 :", (endTime-startTime));
}//
}//
- ArrayList가 느린 이유는 0번 인덱스에 새로운 객체가 추가되면서 기존 객체의 인덱스를 한칸씩 뒤로 미는 작업을 하기 때문이다.