[Java]Collection - List

수경·2023년 8월 13일
0
post-thumbnail

Collection 이란

  • JCF, Java Collection Framework
  • (향상된)배열 형식
  • 기존의 순수 배열을
    - 사용법 개량함
    - 용도에 따른 입출력 방식/효율성 개량함
  • 클래스 + 내부 순수 배열을 가지고 있다.
  • 길이가 가변이다. > 방의 개수를 마음대로 늘리고 줄이는게 가능하다.
  • 자료 구조

Collection 종류

  1. List 계열 (List 인터페이스 == 부모클래스)
  • ArrayList(*)
  • LinkedList
  • Queue
  • Stack
  • Vector(legacy)
    *(legacy): 오래되고 대신 할 구조들이 생겼음, 언젠가 사라질 예정
  1. Set 계열 (Set 인터페이스)
  • HashSet(***)
  • TreeSet
  1. Map 계열 (Map 인터페이스)
  • HashMap(****)
  • TreeMap
  • Properties(legacy)
  • HashTable(legacy)

ArrayList

ArrayList 특징

  1. 내부에 배열을 가지고 있다.
  2. ArrayList 클래스 대부분의 기능이 내부 배열을 조작하는 기능으로 구성되었다.
  3. 길이가 가변 > 데이터를 계속 넣으면 계속 공간이 늘어난다?
  • 기존 ArrayList 4칸 배열이 생성되고 그 이상의 데이터가 들어오면 기존 길이의 2개 길이 배열을 생성한 후 기본 배열에 덮어씌우는 방법으로 공간이 늘어난다.
  • 데이터 요소의 개수를 알고있는 경우라면 순수 배열을 사용하는 것이 좋다.

메소드

  • add(T value) : 요소 추가
  • add(index index, T value) : (원하는 위치에)요소 추가
  • get(int index) : 요소 접근(읽기)
  • size() : 요소의 개수
  • set(int index, T newValue) : 요소 수정
  • remove(int index) : 요소 삭제 / 삭제된 방 이후의 모든 요소는 방번호 1 감소한다.
  • indexOf(T value) : 요소 위치 찾기
  • lastIndexOf(T value) : 요소 배열 끝부터 찾기
  • contains(T value) : 요소 포함 여부
  • isEmpty() : 배열이 비어있는지 여부
  • clear() : 초기화
  • Arrays.toString(배열) : 배열 리스트로 출력

예제코드

import java.util.ArrayList;

public class Ex60_List {
	public static void main(String[] args) {
    
    //선언
    ArrayList<String> list = new ArrayList<String>();
    
    //1. 요소 추가하기
    list.add("바나나");
	list.add("딸기");
    
    list.add(1, "망고");
    
    //2. 요소 접근(읽기)
    System.out.println(list.get(0));	//바나나
    
    //3. 요소의 개수
    System.out.println(list.size());	//3
    
    //4. 요소 수정
    String temp = list.set(0, "딸바");	//변경 전 데이터를 저장한다.
    System.out.println(temp);		//바나나
    
    //5. 요소 삭제
    list.remove(2);
    
    //6. 기타
	System.out.println(list.indexOf("포도"));		//-1
	System.out.println(list.indexOf("망고"));		//1
	System.out.println(list.lastIndexOf("딸바"));	//0
	System.out.println(list.contains("망고"));	//true
	System.out.println(list.isEmpty());			//false
    
    
    System.out.println(list.toString());	//[딸바, 망고]
    System.out.println(list); 				//[딸바, 망고]

바나나
3
바나나
-1
1
0
true
false
[딸바, 망고][딸바, 망고]

LinkedList

ArrayList vs LinkedList

ArrayList

  • 모든 컬렉션 중에서 요소에 접근하는 속도가 가장 빠르다.
  • 요소 삽입/삭제에 대한 비용이 많이 든다.(Shift 발생)

LinkedList

  • 데이터가 연속된 위치에 저장되지 않고 모든 데이터가 데이터 부분과 주소 부분을 별도로 가지고 있다.
  • 데이터는 포인터와 주소를 사용하여 연결한다.
  • 요소 접근 속도가 상대적으로 느리다.
  • 요소 삽입/삭제에 대한 비용이 거의 없다.
    업로드중..

LinkedList 종류

  1. LinkedList : 일반통행(다음 방 주소는 알아도 이전 방 주소는 모른다.)
  2. Double LinkedList : 양반향 통행
  3. Double Circle LinkedList : 양방향 + 처음~끝 연결 / 자바의 디폴트 LinkedList

ArrayList vs LinkedList 작업시간 비교코드


		ArrayList<Integer> list1 = new ArrayList<Integer>();
		LinkedList<Integer> list2 = new LinkedList<Integer>();
		
		long begin = 0, end = 0;
		
		//순차적으로 데이터 추가하기, Append
		System.out.println("[순차적으로 데이터 추가하기, Append]");
		
		begin = System.currentTimeMillis();
		
		for (int i=0; i<1000000; i++) {
			list1.add(i);	//배열끝에 추가하기
		}
		
		end = System.currentTimeMillis();
		
		System.out.printf("ArrayList 작업 시간: %,dms\n", end - begin);
		
		begin = System.currentTimeMillis();
		
		for (int i=0; i<1000000; i++) {
			list2.add(i);	//배열끝에 추가하기
		}
		
		end = System.currentTimeMillis();
		
		System.out.printf("LinkedList 작업 시간: %,dms\n", end - begin);
		System.out.println();
		
		//중간 데이터 추가하기(삽입), Insert
		System.out.println("[중간 데이터 추가하기(삽입), Insert]");
		
		begin = System.currentTimeMillis();
		
		for (int i=0; i<10000; i++) {
			list1.add(0, i);	//삽입하기
		}
		
		end = System.currentTimeMillis();
		
		System.out.printf("ArrayList 작업 시간: %,dms\n", end - begin);
		
		begin = System.currentTimeMillis();
		
		for (int i=0; i<10000; i++) {
			list2.add(0, i);	//삽입하기
		}
		
		end = System.currentTimeMillis();

		System.out.printf("LinkedList 작업 시간: %,dms\n", end - begin);
		System.out.println();
		
		// 중간 데이터 삭제하기, delete
		System.out.println("[중간 데이터 삭제하기, delete]");

		begin = System.currentTimeMillis();

		for (int i = 0; i < 10000; i++) {
			list1.remove(0); // 삭제하기
		}

		end = System.currentTimeMillis();

		System.out.printf("ArrayList 작업 시간: %,dms\n", end - begin);

		begin = System.currentTimeMillis();

		for (int i = 0; i < 10000; i++) {
			list2.remove(0); // 삭제하기
		}

		end = System.currentTimeMillis();

		System.out.printf("LinkedList 작업 시간: %,dms\n", end - begin);
		System.out.println();
		
		
		// 끝에서부터 삭제하기, delete
		System.out.println("[끝에서부터 삭제하기, delete]");

		begin = System.currentTimeMillis();

		for (int i = list1.size()-1; i >=0; i--) {
			list1.remove(i); // 삭제하기
		}

		end = System.currentTimeMillis();

		System.out.printf("ArrayList 작업 시간: %,dms\n", end - begin);

		begin = System.currentTimeMillis();

		for (int i = list2.size()-1; i >=0; i--) {
			list2.remove(i); // 삭제하기
		}

		end = System.currentTimeMillis();

		System.out.printf("LinkedList 작업 시간: %,dms\n", end - begin);

[순차적으로 데이터 추가하기, Append]
ArrayList 작업 시간: 35ms
LinkedList 작업 시간: 119ms

[중간 데이터 추가하기(삽입), Insert]
ArrayList 작업 시간: 2,137ms
LinkedList 작업 시간: 1ms

[중간 데이터 삭제하기, delete]
ArrayList 작업 시간: 1,798ms
LinkedList 작업 시간: 1ms

[끝에서부터 삭제하기, delete]
ArrayList 작업 시간: 8ms
LinkedList 작업 시간: 16ms

Shift 작업이 이뤄지는 데이터 추가, 삭제에서 LikedList보다 ArrayList에서 훨씬 시간이 많이 걸리는 것을 볼 수 있다.

profile
웹백엔드개발자를 꿈꾸는

0개의 댓글