1. Set
ArrayList에서는 데이터 간의 순서가 존재하지만 Set은 집합으로 데이터의 중복을 막도록 설계되었습니다.
- HashSet : 해쉬 테이블에 원소를 저장하기 때문에 성능면에서 가장 우수합니다.
- TreeSet : 레드-블랙 트리(red-black tree)에 원소를 저장합니다. 값에 따라 순서가 결정되지만 HashSet보다는 느립니다. (오름 차순으로 정렬됩니다.)
- LinkedHashSet : 해쉬 테이블과 연결 리스트를 결합한 것으로 원소들의 순서는 삽입되었던 순서와 같습니다.(약간의 비용으로 HashSet의 문제점인 순서의 불명확성을 제거한 방법입니다.)
문자열을 Set에 저장하기
import java.util.HashSet;
public class SetTest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("Milk");
set.add("Bread");
set.add("Butter");
set.add("Cheese");
set.add("Ham");
set.add("Ham");
System.out.println(set);
if(set.contains("Ham")){
System.out.println("Ham도 포함되어 있음");
}
}
}

LinkedHashSet을 사용한다면

TreeSet을 사용한다면

과 같은 결과가 얻어집니다.
2. Map
키-값을 하나의 쌍으로 묶어서 저장하는 자료구조입니다. Map에는 중복된 키를 가질 수 없습니다. 각 키는 오직 하나의 값에만 매핑될 수 있습니다.
Map에 학생들의 데이터 저장하기
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("kim","1234");
map.put("park","pass");
map.put("lee","word");
System.out.println(map.get("lee")); // 키를 가지고 값을 참조
for(String key : map.keySet()){
String value = map.get(key);
System.out.println("Key: " + key + " value: "+ value);
}
// map.remove("kim"); // key : "kim" 인 항목 삭제
map.put("choi","password");
System.out.println(map);
}
}
3. Queue
큐(Queue)는 데이터를 처리하기 전에 잠시 저장하고 있는 자료구조입니다.
- FIFO(first-in-first-out) : 먼저 들어간 데이터가 먼저 처리됩니다.
큐 FIFO 예제
import java.util.LinkedList;
import java.util.Queue;
public class QueueTest {
public static void main(String[] args) {
Queue<Integer> q = new LinkedList<>(); // LinkedList is Queue
for (int i = 0; i < 5; i++) {
q.add(i);
}
System.out.println("큐 : "+q); // 1부터 5까지 순차적으로 데이터가 들어감
int e = q.remove(); // FIFO로 인해 맨처음 들어간 데이터가 삭제됨
System.out.println("삭제된 요소 : "+e);
System.out.println("큐 : "+q);
int r = q.remove(); // FIFO로 인해 그 다음 들어간 데이터가 삭제됨
System.out.println("삭제된 요소 : "+r);
System.out.println("큐 : "+q);
}
}
우선 순위 큐
PriorityQueue : 무작위로 삽입되어도 우선 순위는 가장 작은 원소입니다.
import java.util.PriorityQueue;
public class PriorityQueueTest {
public static void main(String[] args) {
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.add(30);
pq.add(5);
pq.add(80);
pq.add(20);
pq.add(10);
System.out.println(pq); // [5, 10, 80, 30, 20]
System.out.println("삭제된 원소 : "+pq.remove()); // 5삭제 작은 숫자가 우선순위가 높음
System.out.println(pq); // [10, 20, 80, 30] -> 출력 순서가 우선순위와 동일하지는 않음
}
}
Share article