학원 27일차 - Java

·2021년 7월 10일
0

2021.05.04

비슷한 무리의 클래스를 보게되면 > 인터페이스를 볼 것 > 처음 보더라도 기존에 사용하던 기능이 들어있을 수 있음. > 컬렉션

  1. Collection 인터페이스
  2. List 인터페이스
    • Collection > List
  3. Set 인터페이스
    • Collection > Set
  4. Map 인터페이스

List

  • ArrayList, Stack, Queue, LinkedList, (Properties)

Set

  • HashSet, TreeSet

Map

  • HashMap, TreeMap, (HashTable)

LinkedList

  • List 계열
  • ArrayList와 사용법의 유사(같은 추상 메소드를 구현 > 사용법 동일)
  • 내부 구조는 다르다. -> 데이터 저장소의 사용 목적이 다르다. 용도 다름

LinkedList 종류

  1. LinkedList
    • 단방향 탐색 (이전방 탐색 불가..)
  2. Double LinkedList
    • 양방향 탐색
  3. Double Circular LinkedList ★
    • 자바의 LinkedList , 가장 활용도가 높다.

ArrayList vs LinkedList

  • 공통점: 순서를 가지는 배열 > 방번호를 사용한다. > index
  • ArrayList
    • 장점: 모든 컬렉션을 통틀어 특정 요소에 접근 속도가 가장 빠르다.(순수배열과 동일)
    • 단점: 요소의 추가(insert), 삭제 작업 비용이 많이 든다. (한칸씩 이사 부담스러움.)
  • LinkedList
    • 장점: 요소의 추가(insert), 삭제 작업 비용이 저렴하다.
    • 단점: 특정 요소에 접근 속도가 느리다. (번지수가 제각각이라 번지수를 계산할 수 없음.)

  • 순차적으로 추가/삭제 작업 시간

    • ArrayList > LinkedList
  • 중간 추가/삭제 작업 시간

    • LinkedList >>> ArrayList
public class Ex75_LinkedList {

    public static void main(String[] args) {

        //ArrayList vs LinkedList
        ArrayList<Integer> list1 = new ArrayList<Integer>();
        LinkedList<Integer> list2 = new LinkedList<Integer>();

        //요소 추가(Append)
        list1.add(100);
        list1.add(200);
        list1.add(300);

        list2.add(100);
        list2.add(200);
        list2.add(300);

        //요소 접근 get() -> 겉으로는 구분 어려움. 내부적인 메모리 차이만 있음.
        for (int i=0; i<list1.size(); i++) {
            System.out.println(list1.get(i));
        }

        for (int i=0; i<list2.size(); i++) {
            System.out.println(list2.get(i));
        }


        //장단점 테스트 : 특정 작업의 시간 재기
        long begin = 0, end = 0;

        //1. 순차적으로 데이터를 추가하기(Append) -> 둘 다 크게 느껴지는 차이는 없음
        System.out.println("1. 순차적으로 데이터를 추가하기, Append");

        begin = System.currentTimeMillis(); //tick

        //ArrayList 작업
        for (int i=0; i<1000000; i++) {
            list1.add(i);
        }

        end = System.currentTimeMillis(); //tick
        System.out.printf("ArrayList 작업시간: %,dms\n", end-begin); //38ms



        begin = System.currentTimeMillis(); //tick

        //LinkedList 작업
        for (int i=0; i<1000000; i++) {
            list2.add(i);
        }

        end = System.currentTimeMillis(); //tick
        System.out.printf("LinkedList 작업시간: %,dms\n", end-begin); //210ms




        //2. 배열 중간에 데이터 추가하기, Insert(Right Shift 발생)
        System.out.println("2. 배열 중간에 데이터 추가하기, Insert(Right Shift 발생)");

        begin = System.currentTimeMillis(); //tick

        //ArrayList 작업
        for (int i=0; i<10000; i++) {
            list1.add(0, i);
        }

        end = System.currentTimeMillis(); //tick
        System.out.printf("ArrayList 작업시간: %,dms\n", end-begin); //2,247ms -> 중간에 추가 느림




        begin = System.currentTimeMillis(); //tick

        //LinkedList 작업
        for (int i=0; i<10000; i++) {
            list2.add(0, i);
        }

        end = System.currentTimeMillis(); //tick
        System.out.printf("LinkedList 작업시간: %,dms\n", end-begin); //1ms -> 빠름


        

        //3. 배열 중간에 있는 데이터 삭제하기, Delete(Left Shift 발생)
        System.out.println("3. 배열 중간에 있는 데이터 삭제하기, Delete(Left Shift 발생)");


        begin = System.currentTimeMillis(); //tick

        //ArrayList 작업
        for (int i=0; i<10000; i++) {
            list1.remove(0);
        }

        end = System.currentTimeMillis(); //tick
        System.out.printf("ArrayList 작업시간: %,dms\n", end-begin); //1,748ms


        

        begin = System.currentTimeMillis(); //tick

        //LinkedList 작업
        for (int i=0; i<10000; i++) {
            list2.remove(0);
        }

        end = System.currentTimeMillis(); //tick
        System.out.printf("LinkedList 작업시간: %,dms\n", end-begin); //1ms



        //4. 순차적으로 데이터 삭제하기. 끝 -> 처음 (Shift 발생 안함) -> 이동할 일이 없음
        System.out.println("4. 순차적으로 데이터 삭제하기. 끝 -> 처음 (Shift 발생 안함)");

        begin = System.currentTimeMillis(); //tick

        //ArrayList 작업
        for (int i=list1.size()-1; i>=0; i--) {
            list1.remove(i);
        }

        end = System.currentTimeMillis(); //tick
        System.out.printf("ArrayList 작업시간: %,dms\n", end-begin); //9ms



        begin = System.currentTimeMillis(); //tick

        //LinkedList 작업
        for (int i=list1.size()-1; i>=0; i--) {
            list2.remove(i);
        }

        end = System.currentTimeMillis(); //tick
        System.out.printf("LinkedList 작업시간: %,dms\n", end-begin); //0ms

	}
}

컬렉션 탐색 도구

  • 집합의 요소를 접근하는 도구
  1. for문(★★★)
  2. 향상된 for문(★★★) -> 내부에 Iterator 사용
  3. Enumeration
  4. Iterator(★★★)
    • 전진 커서, Forward Cursor
    • 한번 읽은 값은 다시 읽지 못한다. -> 속도가 빠르다.
  5. ListIterator

Iterator

public class Ex76_Collection {
	
	public static void main(String[] args) {
        
        ArrayList<String> list = new ArrayList<String>();
		
		list.add("사과");
		list.add("바나나");
		list.add("포도");
		list.add("딸기");
		list.add("귤");
		list.add("복숭아");
		list.add("참외");
		
		//M1. 일반 for문 -> index 사용O
		for (int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		}
		System.out.println();
		
		//M2. 향상된 for문 -> index 사용X
		for (String item : list) {
			System.out.println(item);
		}
		System.out.println();
		
		//M3. Iterator -> index 사용X ★★★★
		// - ArrayList는 Iterator를 지원한다.
		// - iter: 탐색기(판독기)
		//		a. hasXXX() : 다음에 읽을 요소가 존재하는 지 확인
		//		b. nextXXX() : 다음 요소를 읽어와라(소비)
		Iterator<String> iter = list.iterator();
		
        //있으면 읽고 없으면 종료 -> iterator를 통한 컬렉션 탐색 -> 향상된 for문과 비슷 -> 향상된 for문 내부에 iterator사용
		while (iter.hasNext()) {
			System.out.println(iter.next()); //사과, 바나나, 포도, 딸기, 귤, 복숭아, 참외 -> 한번 읽으면 다시 되돌아갈 수 없다.
		}
		System.out.println();
		
//		System.out.println(iter.hasNext()); //true
//		System.out.println(iter.next()); // 사과
//		
//		System.out.println(iter.hasNext()); // true
//		System.out.println(iter.next()); // 바나나
//		
//		System.out.println(iter.hasNext()); // true
//		System.out.println(iter.next()); // 포도
//		
//		System.out.println(iter.hasNext()); // true 
//		System.out.println(iter.next()); // 딸기
//		
//		System.out.println(iter.hasNext()); // true
//		System.out.println(iter.next()); // 귤
//		
//		System.out.println(iter.hasNext()); // true 
//		System.out.println(iter.next()); // 복숭아
//		
//		System.out.println(iter.hasNext()); // true
//		System.out.println(iter.next()); // 참외
//		
//		System.out.println(iter.hasNext()); // false
//		System.out.println(iter.next()); // 에러
    }
}

public class Ex76_Collection {
	
	public static void main(String[] args) {
        
        //HashMap -> 탐색
		HashMap<String,String> map = new HashMap<String,String>(); // -> 데이터의 순서는 우리가 관여할 수 없다.
		
		map.put("과장", "홍길동");
		map.put("사원", "아무개");
		map.put("대리", "하하하");
		map.put("부장", "호호호");
		
        //탐색+ 접근
        //set -> 순서가 없다.(방번호를 사용하는 메소드가 없다.) -> 탐색 못함 -> iterator제공
		Set<String> set = map.keySet(); // 키 집합 반환
		
		Iterator<String> iter = set.iterator();
		
		while (iter.hasNext()) {
			//키 출력 + 값 출력??
			//System.out.println(iter.next()); //키
			//System.out.println(map.get(iter.next())); //값
			
            //동일한 키와 동일한 값을 보고 싶다면 커서를 한번만 움직여야한다!!!
			String key = iter.next();
			
			System.out.println(key);
			System.out.println(map.get(key));
    }
}
profile
모르면 괴롭고 알면 즐겁다.

0개의 댓글

관련 채용 정보