| 구분 | 장점 | 단점 |
|---|---|---|
| 배열 | - 빠른 접근 속도 - 메모리 사용 효율적 | - 크기 변경 불가 - API 기능 부재 |
| 컬렉션 | - 유연한 크기 조절 - 풍부한 API - 다양한 자료구조 구현체 존재 | - 오버헤드 존재 - 제네릭 사용 필요 - 타입 안전성 문제 발생 가능 |
| 상황 | 추천 자료구조 |
|---|---|
| 요소 수가 고정되어 있고 변경되지 않음 | 배열 |
| 삽입/삭제가 빈번함 | LinkedList, HashMap |
| 검색이 빈번하고 인덱스 기반 접근 필요 | ArrayList |
| 중복을 허용하지 않는 집합이 필요 | HashSet, TreeSet |
| 키-값 구조의 저장이 필요 | HashMap, TreeMap |
같은 타입의 데이터를 연속적으로 저장할 수 있는 고정 크기 자료 구조
int [] arr = new int [5];
int [] arr2 = {1,2,3,4,5};
System.out.println(Arrays.toString(arr2));
// 이거 하면 파이썬에서 한번에 출력하듯이 나옴
// 다차원 배열용은 Arrays.deeptoString(arr);
int [][] arr3 = new int[3][]; // 놀랍게도 이거 됨
arr3[0] = new int[1];
arr3[1] = new int[2];
arr3[2] = new int[3];
for(int [] t : arr3){
System.out.println(t.length);
}
데이터를 효율적으로 저장, 탐색, 정렬, 삭제하기 위한 동적 자료구조들(java.util에 있다.)

중복된 값이 가능하고, 인덱스로 참조 관리하는 자료구조이다.
add(), get(), set(), remove(), indexOf(), lastIndexOf(), contains() // 공통메서드
🔸 ArrayList
🔸 LinkedList
| 연산 | ArrayList | LinkedList |
|---|---|---|
| 인덱스 접근 | O(1) | O(n) |
| 삽입/삭제 (중간) | O(n) (밀어내기 발생) | O(1) (노드 연결만) |
| 메모리 사용 | 적음 (데이터만 저장) | 많음 (데이터 + 링크) |
| 캐시 적중률 | 높음 (연속된 메모리) | 낮음 (불연속 메모리) |
🔸 Vector
모든 메서드에 synchronized 처리(thread-safe)중복을 허용하지 않고 저장 순서를 미보장한다.(null도 하나만)
🔸 HashSet
hashCode()와 equals()를 모두 Override 해야 중복 판단이 정확@EqualsAndHashCode로 자동 생성 가능class Person {
String name;
public Person(String name) { this.name = name; }
}
Set<Person> set = new HashSet<>();
set.add(new Person("Alice"));
set.add(new Person("Alice")); // 다른 객체로 인식됨
System.out.println(set.size()); // 결과: 2
// 둘 다 주소가 다르고 hashCode도 다르고 equals도 false: 중복 아닌걸로 처리
class Person {
String name;
public Person(String name) { this.name = name; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person p = (Person) o;
return this.name.equals(p.name);
}
@Override
public int hashCode() {
return name.hashCode(); // String의 hashCode 사용
}
}
Set<Person> set = new HashSet<>();
set.add(new Person("Alice"));
set.add(new Person("Alice"));
System.out.println(set.size()); // 결과: 1
🔸 TreeSet
Comparable과 Comparator로 정렬 기준 지정 가능TreeSet<Integer> ts = new TreeSet<>();
ts.headSet(10); // 10보다 작은 값
ts.tailSet(10); // 10보다 큰 값
ts.subSet(5, 15); // 5~14 사이 값
기본 정렬 (Comparable)
TreeSet<Integer> set = new TreeSet<>();
set.add(5);
set.add(3);
set.add(10);
System.out.println(set); // [3, 5, 10] - 오름차순 자동 정렬
사용자 정의 정렬 (Comparator 전달)
TreeSet<String> names = new TreeSet<>(Comparator.reverseOrder());
names.add("Alice");
names.add("Bob");
names.add("Charlie");
System.out.println(names); // [Charlie, Bob, Alice]
사용자 객체 정렬 (Comparable 구현)
class Person implements Comparable<Person> {
String name;
int age;
public Person(String name, int age) { this.name = name; this.age = age; }
@Override
public int compareTo(Person o) {
return Integer.compare(this.age, o.age);
}
}
TreeSet<Person> people = new TreeSet<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 20));
🔸 Stack (LIFO, 후입선출)
push(), pop(), peek()Deque<String> stack = new ArrayDeque<>();
stack.push("A");
stack.push("B");
System.out.println(stack.pop()); // "B"
🔸 Queue (FIFO, 선입선출)
offer(e) – 요소 추가poll() – 꺼내고 제거 (비어있으면 null)peek() – 꺼내지 않고 조회Queue<String> queue = new LinkedList<>();
queue.offer("A");
queue.offer("B");
System.out.println(queue.poll()); // "A"
🔸 Deque (Double Ended Queue, 양방향 큐)
addFirst(e), addLast(e)removeFirst(), removeLast()peekFirst(), peekLast()Deque<String> deque = new ArrayDeque<>();
deque.addFirst("A");
deque.addLast("B");
System.out.println(deque.removeLast()); // "B"
🔸 PriorityQueue (우선순위 큐)
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(1);
pq.offer(3);
System.out.println(pq.poll()); // 1 (가장 작은 값부터)
✅ 커스텀 정렬 (내림차순)
java
복사
편집
PriorityQueue<Integer> descPq = new PriorityQueue<>(Comparator.reverseOrder());
descPq.offer(5);
descPq.offer(1);
descPq.offer(3);
System.out.println(descPq.poll()); // 5
Key - Value 매핑 구조로 이루어져 있으면 key는 유일한 값이다.

🔸 HashMap
hashCode() → 버킷 인덱스 결정LinkedList🔸 HashTable
🔸 LinkedHashMap
new LinkedHashMap<>(capacity, loadFactor, accessOrder);
→ accessOrder = true 설정 시, 접근 순서 기준으로 순서 갱신
🔸 TreeMap
🔸 ConcurrentHashMap