[Java]컬렉션(Collections) 정리

컬렉션 프레임워크 란?

  • 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다.
  • 자료구조와 알고리즘을 구조화 하여 클래스로 구현해 놓은 것

https://techvidvan.com/tutorials/java-collection-framework/

구분 종류 중복 허용 순서 존재  정렬 여부 THREAD-SAFE
LIST ArrayList O O X X
LinkedList O O X X
Vector O O X O
SET HashSet X X X X
Linked
HashSet
X O X X
TreeSet X X O X
MAP HashMap X X X X
Linked
HashMap
X O X X
Hashtable X X X O
TreeMap X X O X

 

List는 중복이 가능하고, 순서가 있는 데이터의 집합이다.

  • ArrayList - 특정 원소 조회가 많은 경우 사용하는 것이 좋다.
    • 배열을 이용하여 만든 리스트
    • 기본 크기는 10이지만 원소가 늘어나면 더 큰 배열에 옮긴다.
    • 인덱스로 조회가 가능하므로, 인덱스만 알면 해당 데이터를 빠르게 조회 할 수 있다.
    • 삽입, 삭제를 하면 그 뒤에 있는 데이터를 뒤로 밀거나 앞으로 당겨야 하기 때문에 느리다. (O(N))
  • LinkedList - 조회보다 삽입/삭제가 많은 경우에 사용하는 것이 좋다.
    • 노드와 포인터를 이용하여 만든 리스트이다.
    • 특정 원소를 조회하는 경우 첫 노드 부터 순회해야 하기 때문에 ArrayList에 비해 느리다.
    • 포인터로 각각 노드들을 연결하고 있어서, 삽입/삭제가 빠르다.
      • 단순히 기존 포인터를 끊고 새로운 노드에 연결하면 되기 때문이다.
      • 그러나 중간에 데이터를 삽입, 삭제 할 경우 그 데이터까지 순차적으로 조회해야 하기 때문에 O(N)의 시간복잡도를 가진다.
  • Vector - ArrayList와 비슷하게 배열로 만들어진 리스트지만, thread-safe하다. 
    • 한번에 하나의 스레드만 접근이 가능하다.
    • get, put에 모두 syncronized가 걸려있어서 스레드마다 lock이 걸리게 되고, 성능이 ArrayList보다 좋지 않다.
  • Stack - LIFO(Last-In-First-Out)특성을 가지는 자료구조이다.
    • 마지막에 들어온 원소가 처음으로 나가는 특징을 가진다.
    • 들어올 때는 push, 나갈때는 pop이라는 용어를 사용한다.

 

Set은 중복이 불가능하고, 순서가 없는 데이터의 집합이다.

  • HashSet - 중복을 허용하지 않고, 순서를 가지지 않는다.
    • HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스를 뜻하지 않는다. (동일성)
    • HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출한다. 그리고 같다면 equals()로 두 객체리를 비교해서 동등성을 판단한다.

 

    @Test
    public void hashSetTest() {
        Set<String> hashSet = new HashSet<>();
        hashSet.add("하나");
        hashSet.add("둘");
        hashSet.add("셋");

        System.out.println(hashSet);

        hashSet.add("넷");
        hashSet.add("다섯");

        System.out.println(hashSet);

    }

 

  • LinkedHashSet - 중복은 허용하지 않지만, 순서를 가진다.
    @Test
    public void linkedHashSetTest() {
        Set<String> hashSet = new LinkedHashSet<>();
        hashSet.add("하나");
        hashSet.add("둘");
        hashSet.add("셋");

        System.out.println(hashSet);

        hashSet.add("넷");
        hashSet.add("다섯");

        System.out.println(hashSet);

    }

 

  • TreeSet - 중복은 허용하지않고, 순서를 가지지 않는다. 그러나 정렬이 되어있다.
    • 이진트리를 기반으로 한 Set컬렉션이다.
    @Test
    public void treeSetTest() {
        Set<String> hashSet = new TreeSet<>();
        hashSet.add("하나");
        hashSet.add("둘");
        hashSet.add("셋");

        System.out.println(hashSet);

        hashSet.add("넷");
        hashSet.add("다섯");

        System.out.println(hashSet);
    }

 

Queue는 FIFO(First-In-First-Out)구조를 가진다.

  • 처음 들어온 원소가 처음으로 나간다는 특징이 있다.
  • 들어올때는 enqueue, 나갈때는 dequeue라고 한다.
  • PriorityQueue는 우선순위를 가지는 큐로 원소에 우선순위를 부여하여 높은 순으로 먼저 반환한다. 
  • Dequeue는 양쪽으로 넣고 빼는 것이 가능한 큐 자료구조 이다.

 

Map은 키와 값을 가지고 순서는 기억하지 않으며 키는 중복이 불가능하고, 값은 중복이 가능한 데이터 집합이다.

  • HashMap은 키와 값을 가지고, 순서는 기억하지 않으며 키는 중복이 불가능하고, 값은 중복이 가능하다.
    • key와 value에 null을 허용한다.
    • 동기화를 보장하지 않는다.
    @Test
    public void hashMapTest() {
        Map<String, String> hashMap = new HashMap();
        hashMap.put("사과", "apple");
        hashMap.put("포도", "grape");
        hashMap.put("수박", "watermelon");
        hashMap.put("배", "pear");

        System.out.println(hashMap);
    }

 

  • HashTable은 HashMap과 동일한 특징을 가지지만 Thread-Safe하여 동기화를 지원한다.
    • key와 value에 null을 허용하지 않는다.
    • 동기화를 보장한다.
      • get(), put(), remove() 등에 syncronized 키워드가 붙어있다.
  • LinkedHashMap은 들어온 순서대로 순서를 가지는 Map이다.
    @Test
    public void linkedHashMapTest() {
        Map<String, String> hashMap = new LinkedHashMap<>();
        hashMap.put("사과", "apple");
        hashMap.put("포도", "grape");
        hashMap.put("수박", "watermelon");
        hashMap.put("배", "pear");

        System.out.println(hashMap);
    }

 

  • TreeMap은 key를 기준으로 정렬이 되어 저장되는 Map이다.
    • 이진트리를 기반으로한 Map이다.
      • 부모 키값을 비교하여 낮은 건 왼쪽에 높은건 오른쪽에 Map.Entry를 저장한다.
      • 그래서 저장시간이 다른 자료구조에 비해 오래 걸린다.
    @Test
    public void treeMapTest() {
        Map<String, String> hashMap = new TreeMap<>();
        hashMap.put("사과", "apple");
        hashMap.put("포도", "grape");
        hashMap.put("수박", "watermelon");
        hashMap.put("배", "pear");

        System.out.println(hashMap);
    }

'study' 카테고리의 다른 글

Spring AOP - Transactional, Async  (0) 2022.03.25
[Java]LocalDateTime, OffsetDateTime, ZonedDateTime, Instant  (0) 2022.03.16
[Spring]프로토타입과 스코프  (0) 2021.12.02
[DB]트랜잭션 정리  (0) 2021.12.02
[Spring] Scheduling - CronTask  (0) 2021.10.02

댓글



Designed by JB FACTORY