JAVA/컬렉션 자료구조

[Java] List 컬렉션

숭어싸만코 2023. 5. 31. 09:48

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번 인덱스에 새로운 객체가 추가되면서 기존 객체의 인덱스를 한칸씩 뒤로 미는 작업을 하기 때문이다.