Search
Duplicate
📒

[Java Study] 09-4. Set & Map

상태
완료
수업
Java Study
주제
Collection
4 more properties
참고

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
LinkedHashSetHashSet에 연결리스트를 추가하여 요소들의 순서를 유지합니다.
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,