자바 컬렉션 정리

알비레오·2024년 11월 26일

자바

목록 보기
7/17

컬렉션

1. Iterable
자바 컬렉션의 최상위 인터페이스
반복자(Iterator)를 사용하여 요소를 순회할 수 있도록 정의

주요
메서드

iterator() : 컬렉션의 요소를 반복할 수 있는 Iterator 객체를 반환

예제 코드

List<String> list = Arrays.asList("A", "B", "C");
for (String item : list) {
    System.out.println(item);
}

2. Collection
자바 컬렉션 프레임워크의 기본 인터페이스
데이터를 추가, 삭제, 탐색하는 메서드들을 정의

상속받는 인터페이스

  • List
  • Set
  • Queue

3. List
중복을 허용하며, 요소가 순서를 유지하는 컬렉션

구현 클래스

  • ArrayList
  • LinkedList
  • Vector
  • Stack

3-1 ArrayList
배열 기반의 리스트
크기가 동적으로 늘어나며 검색이 빠르다

특징
- 빠른 조회속도
- 삽입/삭제는 느림

예제코드

import java.util.ArrayList;

ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println(list); // 출력: [Apple, Banana, Cherry]

3-2 LinkedList
노드 기반의 리스트
삽입/삭제가 빠르다

특징

  • 삽입/삭제는 빠르지만, 검색은 느림

예제코드

import java.util.LinkedList;

LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.addFirst("Cherry"); // 맨 앞에 추가
System.out.println(list); // 출력: [Cherry, Apple, Banana]

3-3 Vector
동기화된 배열 기반의 리스트
Thread-safe 환경에서 사용

특징

  • 멀티 스레드 환경에서 안전하지만, 단일스레드에서는 ArrayList보다 느림
  • 크기가 부족하면 현재 크기의 2배로 늘어난다
  • 중복된 요소를 허용하며, 삽입된 순서를 유지한다.

예제코드

import java.util.Vector;

Vector<Integer> vector = new Vector<>();
vector.add(10);
vector.add(20);
System.out.println(vector); // 출력: [10, 20]

3-4 Stack
Vector를 기반으로 한 LIFO(Last In First Out) 구조

주요 메서드

  • push(E e) : 요소 추가
  • pop() : 마지막 요소 제거

예제코드

import java.util.Stack;

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
System.out.println(stack.pop()); // 출력: 2
System.out.println(stack);       // 출력: [1]

4 Queue
FIFO(First In First Out) 방식의 컬렉션

구현 클래스

  • LinkedList
  • PriorityQueue

4-1 LinkedList as Queue

import java.util.LinkedList;
import java.util.Queue;

Queue<String> queue = new LinkedList<>();
queue.add("Apple");
queue.add("Banana");
System.out.println(queue.poll()); // 출력: Apple

5 Deque
양방향 큐로, 앞뒤에서 삽입/삭제가 가능하다

구현 클래스

  • LinkedList
  • ArrayDeque

예제코드

import java.util.ArrayDeque;
import java.util.Deque;

Deque<String> deque = new ArrayDeque<>();
deque.addFirst("Apple");
deque.addLast("Banana");
System.out.println(deque); // 출력: [Apple, Banana]

6 Set
중복을 허용하지 않는 컬렉션

구현 클래스

  • HashSet
  • TreeSet
  • LinkedHashSet

6-1 HashSet
해시 테이블을 사용해 요소 저장, 순서가 없음

예제코드

import java.util.HashSet;

HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
System.out.println(set); // 출력: [Banana, Apple]

6-2 TreeSet
정렬된 형태로 저장

예제코드

import java.util.TreeSet;

TreeSet<String> set = new TreeSet<>();
set.add("Banana");
set.add("Apple");
System.out.println(set); // 출력: [Apple, Banana]

7 Map
키-값 쌍으로 데이터를 저장하는 컬렉션

구현 클래스

  • HashMap
  • TreeMap
  • HashTable

7-1 HashTable
1. 키-값 저장
각 키는 고유하며, 키와 값 모두 null을 허용하지 않는다
동일한 키를 사용해 값을 삽입하면 기존 값이 덮어씌워진다
2. 해싱(Hashing)
내부적으로 데이터를 저장하기 위해 해싱을 사용한다.
키의 hashCode() 메서드를 호출하여 해시값을 계산하고, 이를 기반으로 데이터를 저장할 버킷(bucket)을 결정한다
3. 동기화(Synchronization)
Hashtable은 기본적으로 동기화되어 있어, 멀티스레드 환경에서 안전하게 사용할 수 있다.
그러나 동기화로 인해 성능이 저하될 수 있으며, 이러한 이유로 동기화가 필요하지 않은 경우에는 HashMap이 더 적합하다
4. 순서 보장 없음
삽입된 데이터의 순서를 보장하지 않는다.
5. 충돌 처리
서로 다른 키가 동일한 해시코드를 가질 경우 충돌이 발생할 수 있다.
충돌은 체이닝(Chaining) 방식으로 처리되며, 동일한 버킷에 저장된 항목들은 연결 리스트로 관리된다.
6. 내부 구조
Hashtable은 내부적으로 배열과 연결 리스트를 사용하여 데이터를 저장한다
각 배열의 인덱스는 해시 함수에 의해 결정되며, 이 배열의 각 요소는 버킷(bucket)이라고 부른다
충돌이 발생하면 해당 버킷에 연결 리스트 형태로 데이터를 추가한다.
7 주요 메서드

8. 생성자

import java.util.Hashtable;
public class HashtableExample {
    public static void main(String[] args) {
        // Hashtable 생성
        Hashtable<String, Integer> hashtable = new Hashtable<>();
        // 데이터 추가
        hashtable.put("Alice", 25);
        hashtable.put("Bob", 30);
        hashtable.put("Charlie", 35);
        // 데이터 조회
        System.out.println("Alice's age: " + hashtable.get("Alice"));
        // 데이터 확인
        System.out.println("Contains key 'Bob': " + hashtable.containsKey("Bob"));
        System.out.println("Contains value 30: " + hashtable.containsValue(30));
        // 데이터 삭제
        hashtable.remove("Charlie");
        System.out.println("Size after removal: " + hashtable.size());
    }
}

7-2 HashMap
해시 테이블 기반의 맵
순서 없음

import java.util.HashMap;

HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.put("Banana", 20);
System.out.println(map); // 출력: {Apple=10, Banana=20}

7-3 TreeMap
키의 오름차순으로 정렬된 맵

예제코드

import java.util.TreeMap;

TreeMap<String, Integer> map = new TreeMap<>();
map.put("Banana", 20);
map.put("Apple", 10);
System.out.println(map); // 출력: {Apple=10, Banana=20}

요약

  • List : ArrayList, LinkedList, Vector, Stack
  • Set : HashSet, TreeSet
  • Map : HashMap, TreeMap
  • Queue/Deque : LinkedList, ArrayDeque

3개의 댓글

comment-user-thumbnail
2024년 11월 27일

열심히 하는군요..?? 혹시 취업 완전 백엔드로 가실건가요? 데이터 엔지니어나, 서버 관리 이런쪽..??

1개의 답글