[JAVA] 컬렉션

Geunhyung Pyun·2023년 1월 3일
0
post-custom-banner

Collection

  • 여러 원소들을 담을 수 있는 자료구조
  • 가장 상위 인터페이스는 Iterable로 foreach 구문을 사용할 수 있는 객체들을 의미한다.(1.5버전부터 사용가능)
  • 배열과는 달리 동적 메모리 할당으로 필요한 만큼 공간을 추가할 수 있다. (Map도 여기에 포함이 된다.)
  • 한 가지 인수를 가지는 생성자를 통해서 생성이 가능하며 해당 생성자를 통해서 사용자는 아무 collection이나 복사를 해서 원하는 타입의 자료구조를 생성해 사용할 수 있다.
  • 만약 메서드를 통해서 collection을 조작하고 하는 경우, 조작이 될 수 없는 경우에는 UnsupportedOperationException 에러가 터진다.
    • 예시) addAll(Collection) : Collection 안에 있는 원소들을 다 더하는 메서드로 Collection이 비어있는 경우 UnsupportedOperationException이 발생한다.
  • 몇몇의 implemetaion은 null을 허용하지 않고 몇몇은 원소의 타입을 제한한다. 만약 이를 위배할 경우 각각 NullPointerException, ClassCastException이 발생한다. 이를 피하기 위해서는 Optional과 같은 객체를 사용하는 방법이 있다.

method

메소드리턴설명
add(E e)booleanCollection 안에 원소 e를 넣는다.
addAll(Collection <? extends E> c)booleanCollection 안에 collection c를 넣는다.
clear()voidCollection을 비운다.
contains(Object o)booleanCollection 안에 o가 포함되어 있으면 true, 아니면 false를 반환한다.
containsAll(Collection<?> c)booleanCollection 안에 c가 포함되어 있으면 true, 아니면 false를 반환한다.
equals(Object o)boolean특정한 Object인 비교했을 때 동일하면 true, 아니면 false를 반환한다.
hashCode()intCollection의 해시 코드를 반환한다.
isEmpty()booleanCollection이 비어있다면 true, 아니면 false를 반환한다.
iterator()Iterator<E>Collection을 Iterator로 반환한다.
parallelStream()Stream<E>Collection을 parallelStream으로 반환한다.
remove(Object o)booleanCollection 안에 o가 존재할 시 삭제한다.
removeAll(Collection<?> c)booleanCollection 안에 c 안의 원소들을 삭제한다.
removeIf(Predicate<? super E> filter)boolean주어진 Predicate를 충족할 시 Collection 안의 모든 원소를 삭제한다.
retainAll(Collection<?> c)booleanCollection 안의 c만 유지하고 나머지는 삭제한다.
size()intCollection의 크기를 반환한다.
spliterator()Spliterator<E>Collection을 spliterator를 반환한다.
stream()Stream<E>Collection을 stream으로 반환한다.
toArray()Object[]Collection을 배열로 반환한다.

하위 인터페이스

  • 하위 인터페이스로는 List, Queue, Set이 있다.
  • Map은 따로 존재하나 Collection으로 분류를 한다.

List

  • 정렬된 모든 객체 Collection을 저장할 수 있는 목록 데이터 전용
  • ArrayList

    • 표준 배열보다는 느리나 동적 배열을 제공.
    • 단방향 포인터 구조로 인덱스를 가지고 있어 조회 기능에 성능이 뛰어나다.
    • 추가, 삭제에는 느리다.
    • 여러 스레드 공유 시 안전하지 않다.
  • LinkedList

    • 요소가 연속된 위치에 저장되지 않고 모든 요소가 데이터 부분과 주소 부분이 있는 별도의 객체에 저장된다.
    • 이 때 각 요소를 노드라고 부른다.
    • 양방향 포인터 구조로 삽입, 삭제에는 데이터 위치 정보만 수정하면 되기에 좋은 성능을 보인다.
    • 검색에는 느리다.
  • Vector

    • 동적 배열을 제공이 된다는 것은 ArrayList와 비슷하다.
    • ArrayList와의 차이는 Vector는 동기화가 되고 ArrayList는 동기화가 되지 않는다.
    • Thread safe하다.
    • 무겁고 성능이 좋지 않아 잘 안 쓰인다.
  • Stack

    • LIFO
    • 스택 구조를 구현할 때 사용

Queue

  • FIFO로 한 쪽에서만 요소를 추가하고 제거가 가능하다.
  • PriorityQueue

    • 우선 순위에 따라 객체를 처리해야 할 때 사용
    • 기본적으로 FIFO이나 우선 순위 힙을 기반으로 한다.
  • Deque

    • 큐 데이터 구조 변형
    • 양방향 큐로 양쪽 끝에서 요소를 추가하고 제거가 가능하다.
    • ArrayDeque

      • 크기가 조정되고 양방향에서 요소를 추가하고 제거하는 구조

Set

  • 중복 값을 저장할 수 없는 정렬되지 않는 데이터 모음
  • 고유한 값을 가지고 싶을 때 사용
  • HashSet

    • 동일한 순서로 삽입된다고 하여 순서를 보장하지는 않는다.
    • Null 요소 삽입을 허용
    • 가장 빠른 접근 속도를 가진다.
  • LinkedHashSet

    • HashSet과 유사하지만 입력하는 대로 데이터를 저장하는 순서는 유지된다.
  • SortedSet

    • 순서를 정렬할 수 있는 Set이다.
    • TreeSet

      • Tree를 사용하여 저장한다.
      • 순서를 지정할 수 있고 기본은 오름차순이다.

Map

  • 데이터를 키-값으로 매핑을 지원하는 구조이다.
  • 중복 키를 지원하지 않는다.
  • HashTable

    • HashMap보다는 느리나 동기화를 지원한다.
    • null은 불가하다.
    • Thread safe하다.
  • HashMap

    • 중복과 순서가 허용되지 않고 null 값이 가능하다.
  • TreeMap

    • 키와 값을 저장함과 동시에 키를 정렬한다 (오름차순).
    • 검색이 빠르다.

참고

https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html
https://www.crocus.co.kr/1553
https://crazykim2.tistory.com/557
https://choicode.tistory.com/25

profile
개발자를 원하는 사람.
post-custom-banner

0개의 댓글