개발 하나둘셋/Java & Spring

Java 컬렉션 - list, set, map, stack, queue

유리코딩 2021. 11. 11. 10:44
반응형

개념정리

컬렉션 - list, set, map, stack, queue


 

1. 컬렉션 인터페이스

  1. List : 순서가 있는 데이터의 집합이며 데이터의 중복을 허용. → ArrayList, LinkedList, Stack 등
  2. Set : 순서를 유지하지 않는 데이터의 집합이며 데이터의 중복을 허용. → HashSet, TreeSet 등
  3. Map : 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합. 순서는 유지되지 않으며 키는 중복을 허용되지 않고 값은 중복을 허용 → HashMap, TreeMap 등
  4. Stack : 마지막에 넣은 데이터를 먼저 꺼내는 자료구조. LIFO(Last In First Out) → Stack, ArrayDeque 등
  5. Queue : 먼저 넣은 데이터를 먼저 꺼내는 자료구조. FIFO(First In First Out) → Queue, ArrayDeque 등

 

2. List

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>(10);
        list.add(1);
        list.add(5);
        list.add(4);
        list.add(11);
        list.add(10); // ArrayList에 값 한개씩 입력
        System.out.println(list); // [1,5,4,11,10]

        Collections.sort(list); // list 정렬
        System.out.println(list); // [1,4,5,10,11]

        System.out.println(list.size()); // arrayList의 크기 출력 => 5

        list.remove(4); // 인덱스를 활용하여 해당하는 값 제거(4번째 자리)
        System.out.println(list); // [1,4,5,10]

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i)); // get을 이용하여 값 1개씩 출력
        }
		for (int current : list) {
			System.out.println(current); // 위 반복문과 똑같이 출력
        }

    }
}

 

2. Set

  • 순서를 유지하지 않는 데이터의 집합이며 데이터의 중복을 허용하지 않음
  • HashSet은 Set 인터페이스를 구현한 대표적인 컬렉션
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<Integer> integerSet = new HashSet<>(); // Collection의 자료형에는 primitive 타입은 올 수 없습니다. primitive 타입에 해당하는 class 가 존재하니 그것을 사용하세요.
        integerSet.add(1);
        integerSet.add(1);
        integerSet.add(3);
        integerSet.add(2);
        integerSet.add(9);
        integerSet.add(8);// 하나씩 값을 삽입합니다.
        System.out.println(integerSet); // [1, 2, 3, 8, 9]
        // 출력을 해보면 순서가 지켜지지 않고 중복 없음

        Set<String> stringSet = new HashSet<>();
        stringSet.add("LA");
        stringSet.add("New York");
        stringSet.add("LasVegas");
        stringSet.add("San Francisco");
        stringSet.add("Seoul");
        System.out.println(stringSet);

        stringSet.remove("Seoul"); //Seoul을 HashSet에서 제거해보겠습니다.
        System.out.println(stringSet);

        ArrayList<String> target = new ArrayList<String>();
        target.add("New York");
        target.add("LasVegas");//제거할 항목을 ArrayList에 삽입하겠습니다.
        stringSet.removeAll(target);//제거항목에 삽입된 도시들을 삭제하겠습니다.
        System.out.println(stringSet);

        System.out.println("LA가 포함되어있나요? " + stringSet.contains("LA")); // contains(object) boolean으로 리턴
        System.out.println("LA가 포함되어있나요? " + stringSet.contains("LasVegas"));
        //LA가 HashSet에 포함되어있으면 true를, 그렇지 않으면 false를 반환합니다.

        System.out.println("현재 HashSet의 크기는 : " + stringSet.size() + "입니다.");
        //HashSet의 크기를 반환합니다.

        stringSet.clear();//HashSet의 모든 아이템들을 삭제합니다.
        System.out.println(stringSet);
    }
}

 

3. Map

  • HashMap은 키(key)와 값(value)을 하나의 데이터로 저장하는 특징을 가짐. 이를 통하여 해싱(hashing)을 가능하게 하여 데이터를 검색하는데 뛰어난 성능을 보임
  • 해싱(hashing)이란 키(Key) 값을 해시 함수라는 수식에 대입시켜 계산한 후 나온 결과를 주소로 사용하여 바로 값(Value)에 접근하게 할 수 하는 방법
  • 해시함수 : 키(Key) 값을 값(Value)이 저장되는 주소 값으로 바꾸기 위한 수식
  • 추가 hash에 대한 내용 ==> https://dev-kani.tistory.com/2
public class Main {
    public static void main(String[] args) {
		Map<Integer, String> map = new HashMap<>();  // <key,value>
        map.put(1, "apple");
        map.put(2, "berry");
        map.put(3, "cherry");

        System.out.println(map);

        System.out.println("1st in map: " + map.get(1)); //get으로 불러오기

        map.remove(2);
        System.out.println(map);
        System.out.println(map.containsKey(2));
        System.out.println(map.containsValue("cherry"));
        
        map.clear();
        System.out.println(map);
    }
}

 

4. Stack

  • 마지막에 저장한 데이터를 가장 먼저 꺼내는 자료구조 -> LIFO(Last In First Out).
  • 스택의 예 : 웹브라우저의 앞페이지 이동 뒤페이지 이동 / 그릇 쌓기
  • 먼저 삽입된 값인 17이 가장 아래로, 이후 삽입되는 값은 그 위에 쌓이기 시작. 이후, pop()을 통해 값을 반환할 때도 마지막에 삽입된 값인 45가 가장 먼저 반환되죠!

public class Main {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(3);
        stack.push(5);
        stack.push(7);
        System.out.println(stack); // Stack을 출력합니다

        System.out.println(stack.peek()); // Stack의 가장 상단 값을 출력합니다.(삭제는 하지 않습니다.)
        stack.pop(); // Stack의 가장 상단 값을 제거합니다.
        System.out.println(stack);
        System.out.println(stack.size()); // Stack의 크기를 반환합니다.
        System.out.println(stack.contains(1)); // Stack에 1이라는 값이 있으면 true를, 그렇지 않으면 false를 반환합니다.
        System.out.println(stack.empty()); // STack이 비어있으면 true를, 그렇지 않으면 false를 반환합니다.
        System.out.println(stack);
    }
}

 

5. Queue

  • 처음에 저장한 데이터를 가장 먼저 꺼내는 자료구조 -> FIFO(First In First Out)
  • 큐의 예 : 은행 창구 줄서기 / 인쇄작업 대기목록
  • 큐는 양 쪽 끝의 통로가 뚫려있다고 생각하면 됨. 가장 먼저 들어온 Data가 반환이 될때도 가장 먼저 반환
  • 큐는 우선순위 큐, 원형 우선순위 큐, 원형 큐 등 다양하게 존재

public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(1);
        queue.add(3);
        queue.add(5);//Queue에 값 삽입합니다.
        System.out.println(queue);//Queue 출력 : [1, 3, 5]
        System.out.println(queue.poll()); // Queue에서 객체를 꺼내서 반환 : 1
        queue.add(7);
        queue.add(11);
        queue.add(9);
        System.out.println(queue); // [3, 5, 7, 11, 9]
        System.out.println(queue.peek()); //Queue에서 삭제 없이 요소를 반환 : 3
        System.out.println(queue); // [3, 5, 7, 11, 9]
    }
}

 

반응형