[Java] HashMap๊ณผ HashSet

JHLeeยท2025๋…„ 4์›” 21์ผ

Java

๋ชฉ๋ก ๋ณด๊ธฐ
1/1

1. HashMap

๐Ÿ“š ๊ฐœ๋…

HashMap์€ Map ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋กœ ํ‚ค(key)-๊ฐ’(value) ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ Entry ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์œ„์น˜(๋ฒ„ํ‚ท)๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

import java.util.HashMap;

HashMap<Integer, String> hashMap = new HashMap<>(); 

// ๋‹คํ˜•์„ฑ ์ ์šฉ
Map<Integer, String> map = new HashMap<>(); 

โญ๏ธ ํŠน์ง•

  • ํ•˜๋‚˜์˜ ํ‚ค๋Š” ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ํ‚ค๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†๊ณ , ๊ฐ’์€ ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ‚ค์— null ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • ์ €์žฅ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

โš™๏ธ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ

1๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€์‹œ ( put(key, value) )

  1. ํ‚ค์˜ hashCode()๋กœ ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.

  2. ํ•ด์‹œ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด๋‹น ํ‚ค๊ฐ€ ์ €์žฅ๋  ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ๊ฒฐ์ •ํ•œ๋‹ค.

  3. ํ•ด๋‹น ๋ฒ„ํ‚ท์— ์ด๋ฏธ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ €์žฅ๋œ ํ‚ค์™€ equals()๋กœ ์™„์ „ํžˆ ๊ฐ™์€ ๊ฐ์ฒด์ธ์ง€ ๋น„๊ตํ•œ๋‹ค.

    • true ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋ฉด, ์ค‘๋ณต๋œ ์š”์†Œ๋ผ ํŒ๋‹จํ•˜๊ณ  ๊ธฐ์กด ๊ฐ’์„ ๋ฎ์–ด์“ด๋‹ค.
    • false ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋ฉด, ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค.

    ์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://en.wikipedia.org/wiki/Hash_collision

2๏ธโƒฃ ํ•ด์‹œ ์ถฉ๋Œ(Collision)์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ

  • ๊ธฐ์กด ๋ฐฉ์‹ (Java 7 ์ดํ•˜) : ๋™์ผ ๋ฒ„ํ‚ท์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜์—ฌ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด O(n)๊นŒ์ง€ ๋–จ์–ด์ง„๋‹ค.
  • Java 8 ์ดํ›„ : ๋™์ผ ๋ฒ„ํ‚ท์— ์ €์žฅ๋œ ๊ฐ’์ด 8๊ฐœ ์ด์ƒ์ด๊ณ , ์ „์ฒด ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๊ฐ€ 64 ์ด์ƒ์ผ ๋•Œ, ํ•ด๋‹น ๋ฒ„ํ‚ท์˜ ๊ตฌ์กฐ๊ฐ€ Red-Black Tree ๊ตฌ์กฐ๋กœ ์ „ํ™˜๋˜์–ด ์ตœ์•…์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด O(log n)๊นŒ์ง€ ๊ฐœ์„ ๋œ๋‹ค.

โ—๏ธ HashMap์ด ํ‚ค ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ

  • ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ํ‚ค ๊ฐ์ฒด(ex. ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด)์— hashCode(), equals() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์™„์ „ํžˆ ๊ฐ™์€ ๊ฐ์ฒด์—ฌ๋„, ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ํŒ๋‹จ๋˜์–ด ์ค‘๋ณต์ด ํ—ˆ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

โž• ์ฃผ์š” ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ์„ค๋ช…
put(K key, V value)ํ‚ค-๊ฐ’ ์Œ ์ถ”๊ฐ€
get(Object key) ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’ ๋ฐ˜ํ™˜
remove(Object key)ํ‚ค-๊ฐ’ ์Œ ์ œ๊ฑฐ
clear() ๋ชจ๋“  ํ‚ค-๊ฐ’ ์Œ ์ œ๊ฑฐ
containsKey(Object key)ํŠน์ • ํ‚ค ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
containsValue(Object value)ํŠน์ • ๊ฐ’ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
keySet() ํ‚ค๋ฅผ Set ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
entrySet()๋ชจ๋“  ํ‚ค-๊ฐ’ ์Œ์„ Set ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
values()๊ฐ’์„ Collection ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜

2. HashSet

๐Ÿ“š ๊ฐœ๋…

  • HashSet์€ Set ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋กœ Hash ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๋ฉฐ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ง‘ํ•ฉ(Set) ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
import java.util.HashSet;

HashSet<ํƒ€์ž…> hashSet = new HashSet<>(); 

// ๋‹คํ˜•์„ฑ ์ ์šฉ
Set<ํƒ€์ž…> set = new HashSet<>(); 

โญ๏ธ ํŠน์ง•

  • ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • null ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค. (HashMap์˜ key์— null์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ)

โš™๏ธ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹

private transient HashMap<E,Object> map;	// ๋ฐฑ์—…์šฉ HashMap

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();	// ๋”๋ฏธ ๊ฐ์ฒด

public HashSet() {
    map = new HashMap<>();
}
    
  • Java์—์„œ์˜ HashSet ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ HashMap์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • HashSet์˜ ๋‚ด๋ถ€ ์ €์žฅ์†Œ๋กœ ๋ฐฑ์—…์šฉ HashMap์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์š”์†Œ๋Š” map์˜ key๋กœ ์ €์žฅ๋˜๋ฉฐ, value๋Š” ๋ชจ๋‘ ๊ฐ™์€ ๋”๋ฏธ ๊ฐ์ฒด(PRESENT)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
  • ์ฆ‰, HashSet.add(x)๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ map.put(x, PRESENT)์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

HashSet์€ HashMap๊ณผ ๋™์ผํ•˜๊ฒŒ hashCode(), equals() ๋ฉ”์„œ๋“œ๋กœ ๊ฐ’์˜ ์ค‘๋ณต์„ ํŒ๋‹จํ•œ๋‹ค.

โž• ์ฃผ์š” ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ์„ค๋ช…
add(E e)์š”์†Œ๋ฅผ ์ถ”๊ฐ€. ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์ถ”๊ฐ€ ์•ˆ ํ•จ, false ๋ฐ˜ํ™˜
remove(Object o)์š”์†Œ๋ฅผ ์ œ๊ฑฐ. ์กด์žฌํ–ˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false ๋ฐ˜ํ™˜
contains(Object o)์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ํ™•์ธ
size()ํ˜„์žฌ ์š”์†Œ ๊ฐœ์ˆ˜ ๋ฐ˜ํ™˜
clear()๋ชจ๋“  ์š”์†Œ ์ œ๊ฑฐ
isEmpty()๋น„์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ํ™•์ธ
iterator()์š”์†Œ ์ˆœํšŒ์šฉ ๋ฐ˜๋ณต์ž ๋ฐ˜ํ™˜. fail-fast ๋™์ž‘
clone()์–•์€ ๋ณต์‚ฌ๋ณธ ๋ฐ˜ํ™˜ (์š”์†Œ ์ž์ฒด๋Š” ๋ณต์‚ฌํ•˜์ง€ ์•Š์Œ)
spliterator()๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ถ„ํ•  ๋ฐ˜๋ณต์ž ์ œ๊ณต (Java 8๋ถ€ํ„ฐ ์ง€์›)

์ •๋ฆฌ

  • HashMap์€ ํ‚ค-๊ฐ’ ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • HashSet์€ ๊ฐ’์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ์ง‘ํ•ฉ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋‘ ์ž๋ฃŒ๊ตฌ์กฐ ๋ชจ๋‘ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ, ํ‰๊ท ์ ์œผ๋กœ O(1)์˜ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•œ๋‹ค.
  • ํ•ด์‹œ ์ถฉ๋Œ ๋ฐœ์ƒ์‹œ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด O(n), Java 8 ์ดํ›„์—๋Š” O(log n)์œผ๋กœ ๋–จ์–ด์ง„๋‹ค.

๐Ÿ“ƒ ์ฐธ๊ณ  ๋ฌธ์„œ

profile
๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€