참고
Set
NOTE
자바의 java.util.Set 인터페이스는 중복을 허용하지 않는 유일한 요소의 집합을 나타내며, HashSet, LinkedHashSet, TreeSet등의 여러 구현 클래스를 가지고 있습니다.
Set 구현흐름도
public static void main(String[] args) {
Set<String> set = new HashSet<>();
// add(E e) - 지정된 요소를 세트에 추가
set.add("Apple");
set.add("Banana");
set.add("Cherry");
System.out.println("Set after add: " + set);
// addAll(Collection c) - 합집합
Set<String> otherSet = Set.of("Durian", "ElderBerry");
set.addAll(otherSet);
System.out.println("set = " + set);
// continas(Object o) - 포함여부
boolean contains = set.contains("Apple");
boolean containsAll = set.containsAll(otherSet);
// remove(Object o) - 제거
set.remove("banana");
set.removeAll(otherSet);
// retainAll - 교집합
set.add("Fig");
Set<String> retainSet = Set.of("Apple", "Fig");
set.retainAll(retainSet);
System.out.println("set = " + set);
// toArray(T a) - 세트의 모든 요소를 지정된 배열로 반환
String[] stringArray = new String[set.size()];
set.toArray(stringArray);
System.out.print("Set elements as String array: ");
for (String element : stringArray) {
System.out.print(element + " ");
}
}
Java
복사
Set 최적화
해시 기반 자료구조를 사용하면, 통계적으로 입력 데이터의 수가 배열 크기의 75%를 초과하면 해시 인덱스 충돌이 자주 발생합니다. 따라서 75%를 초과하면 배열 크기를 2배로 늘리고, 늘어난 크기를 기준으로 모든 요소에 해시 인덱스를 재적용합니다.
4/5 - 데이터의 양 75% 증가
배열의 크기 2배 증가, hash 재계산
HashSet
NOTE
HashSet은 해시 자료 구조를 사용하여 요소를 저장하고, 특정 순서 없이 저장되고 정렬이 불가능합니다.
public static void main(String[] args) {
HashSet<String> hashSet = new HashSet<>();
run(hashSet);
}
private static void run(Set<String> set) {
System.out.println("set = " + set.getClass());
set.add("C");
set.add("B");
set.add("A");
set.add("1");
set.add("2");
System.out.println("set = " + set);
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next() + " ");
}
System.out.println();
}
Java
복사
=== 출력결과 ===
set = class java.util.HashSet
set = [A, 1, B, 2, C]
•
HahSet은 이후에 다루는 HashMap에서 value를 제거한 형태를 가지고 있습니다.
LinkedHashSet
NOTE
LinkedHashSet은 HashSet에 연결리스트를 추가하여 요소들의 순서를 유지합니다.
public static void main(String[] args) {
HashSet<String> linkedHashSet = new LinkedHashSet<>();
run(linkedHashSet);
}
private static void run(Set<String> set) {
System.out.println("set = " + set.getClass());
set.add("C");
set.add("B");
set.add("A");
set.add("1");
set.add("2");
System.out.println("set = " + set);
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next() + " ");
}
System.out.println();
}
Java
복사
=== 출력결과 ===
set = class java.util.LinkedHashSet
set = [C, B, A, 1, 2]
LinkedHashSet 구조
TreeSet
NOTE
TreeSet은 이진 탐색 트리를 개선한 레드-블랙 트리를 내부적으로 사용하여 요소를 저장합니다. 이 는 요소들이 정렬된 순서로 저장되며, 주요 연산들의 시간 복잡도가 O(log n)을 가집니다.
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<>();
run(treeSet);
}
private static void run(Set<String> set) {
System.out.println("set = " + set.getClass());
set.add("C");
set.add("B");
set.add("A");
set.add("1");
set.add("2");
System.out.println("set = " + set);
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next() + " ");
}
System.out.println();
}
Java
복사
=== 출력결과 ===
set = class java.util.TreeSet
set = [1, 2, A, B, C]
Map
NOTE
Map은 key-value쌍을 저장하는 자료구조 입니다. key는 중복될 수 없지만 value은 중복될 수 있으며, Map은 key를 통해 값을 빠르게 검색할 수 있습니다.
Map 구현 흐름도
public static void main(String[] args) {
Map<String, Integer> studentMap = new HashMap<>();
studentMap.put("studentA", 90);
studentMap.put("studentB", 80);
studentMap.put("studentC", 80);
studentMap.put("studentD", 100);
System.out.println(studentMap);
// 특정 학생의 값 조회
Integer result = studentMap.get("studentD");
System.out.println("result = " + result);
// keySet 활용
Set<String> keySet = studentMap.keySet();
for (String key : keySet) {
Integer value = studentMap.get(key);
System.out.println("key = " + key + ", value = " + value);
}
// values 활용
Collection<Integer> values = studentMap.values();
for (Integer value : values) {
System.out.println("value = " + value);
}
// entrySet 활용
Set<Map.Entry<String, Integer>> entries = studentMap.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("key = " + key + ", value = " + value);
}
}
Java
복사
HashMap
NOTE
HashMap은 해시를 이용해서 요소를 저장합니다. 기본적으로 HashSet과 동일해 순서를 보장하지 않습니다.
public static void main(String[] args) {
run(new HashMap<>());
}
private static void run(Map<String, Integer> map) {
System.out.println("map = " + map.getClass());
map.put("C", 10);
map.put("B", 20);
map.put("A", 30);
map.put("1", 40);
map.put("2", 50);
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.print("key = " + key + " value = " + map.get(key) + ", ");
}
System.out.println();
}
Java
복사
=== 출력결과 ===
map = class java.util.HashMap
key = A value = 30, key = 1 value = 40, key = B value = 20, key = 2 value = 50, key = C value = 10,
LinkedHashMap
NOTE
LinkedHashSet은 LinkedHashMap과 유사하게, 연결리스트를 사용하여 삽입 순서 또는 최근 접근 순서에 따라 요소를 유지합니다.
public static void main(String[] args) {
run(new LinkedHashMap<>());
}
private static void run(Map<String, Integer> map) {
System.out.println("map = " + map.getClass());
map.put("C", 10);
map.put("B", 20);
map.put("A", 30);
map.put("1", 40);
map.put("2", 50);
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.print("key = " + key + " value = " + map.get(key) + ", ");
}
System.out.println();
}
Java
복사
=== 출력결과 ===
map = class java.util.LinkedHashMap
key = C value = 10, key = B value = 20, key = A value = 30, key = 1 value = 40, key = 2 value = 50,
TreeMap
NOTE
TreeMap은 레드-블랙 트리를 기반으로 키가 정렬된 순서로 저장됩니다.
public static void main(String[] args) {
run(new TreeMap<>());
}
private static void run(Map<String, Integer> map) {
System.out.println("map = " + map.getClass());
map.put("C", 10);
map.put("B", 20);
map.put("A", 30);
map.put("1", 40);
map.put("2", 50);
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.print("key = " + key + " value = " + map.get(key));
}
System.out.println();
}
Java
복사
=== 출력결과 ===
map = class java.util.TreeMap
key = 1 value = 40, key = 2 value = 50, key = A value = 30, key = B value = 20, key = C value = 10,