Map

๊ฒ€์ƒ‰์˜ ๊ฐœ๋…์ด ๊ฐ€๋ฏธ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ Key ์™€ Value ์˜ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

๋•Œ๋ฌธ์— ํ•ด๋‹น Key ๋ฅผ ์ด์šฉํ•ด์„œ Value ๊ฐ’์„ ์–ป์„์ˆ˜ ์žˆ๋‹ค.

Hashtable 1.0

๊ฐ€์žฅ ์ฒ˜์Œ์— ๋‚˜์˜จ ํ•ด์‹œํ…Œ์ด๋ธ”์„ ๊ฐ€์ง„ ๋งต ํด๋ž˜์Šค

  • Key & Value ์— null ์ด ํ—ˆ์šฉ๋œ๋‹ค.
  • ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
  • ๋™์‹œ์„ฑ ๋ณด์žฅ์ด ๋œ๋‹ค.
    • synchronized ํ‚ค์›Œ๋“œ๋ฅผ Method ์ „์ฒด์— Lock ์„ ์ ์šฉํ•œ๋‹ค.
    • Hashtable ์„ ์ฐธ์กฐํ•˜๋Š” Thread ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก Lock ์„ ํš๋“ํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„๋น„์šฉ์ด ๋งŽ์ด ๋“ค์–ด ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ๋‚ฎ์•„์ง„๋‹ค.
  • HashMap ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค.
    • 2์ฐจ ํ•ด์‹œํ•จ์ˆ˜ ์‚ฌ์šฉ๋ถˆ๊ฐ€
    • ๋‹จ์ผ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉ์‹œ Locking ์ด ๋Š๋ฆผ

HashMap 1.2

  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์—์„œ ๋™์‹œ์„ฑ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. (Thread-not-safe)
    • ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์—์„œ๋Š” ์šฐ์„ ์œผ๋กœ ์‚ฌ์šฉ
  • Key & Value ์— null ํ—ˆ์šฉ
    • ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•จ

ํƒ์ƒ‰์„ ์œ„ํ•œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1) ๋กœ ๋ณด์žฅ๋œ๋‹ค.

๋™์‹œ์„ฑ ๋ณด์žฅ์„ ์›ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€ํ˜•ํ•ด์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

Map<K, V> m = Collections.synchronizedMap(new HashMap<>());

ํ•˜์ง€๋งŒ ๋™์‹œ์„ฑ ์ด์Šˆ๊ฐ€ ์žˆ๋‹ค๋ฉด ConcurrentHashMap ์„ ์ถ”์ฒœํ•จ

ConcurrentHashMap 1.5

HashMap ์„ thread-safe ํ•˜๋„๋ก ๋งŒ๋“  ํด๋ž˜์Šค๊ฐ€ ConcurrentHashMap ์ด๋ฉฐ, key & value ์— null ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
๋‘˜ ๋‹ค ๋™๊ธฐํ™” ๋ณด์žฅ์„ ํ•˜๋Š” ํŠน์ง•์ด ์žˆ์ง€๋งŒ ๊ตฌ์กฐ์ ์œผ๋กœ ์ž‘์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • ๋™์‹œ์„ฑ ๋ณด์žฅ์„ ํ•œ๋‹ค.
    • ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋‘๊ณ  ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋ฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…, ์ฐธ์กฐ ํ•˜๋”๋ผ๋„ ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ์„ธ๊ทธ๋จผํŠธ์— ์œ„์น˜ํ•˜๋ฉด ์„œ๋กœ Lock ์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ฒฝ์Ÿํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ Lock Striping ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • Key & Value ์— null ํ—ˆ์šฉ ๋ถˆ๊ฐ€

TreeMap 1.2

  • ์ •๋ ฌ๊ธฐ๋Šฅ์„ ์ง€์›ํ•จ

์ฐธ๊ณ ์ž๋ฃŒ

http://egloos.zum.com/Agbird/v/4849046

Hash ๋ฅผ ์ด์šฉํ•œ Map ๊ด€๋ฆฌ

๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ํ˜น์€ ์กฐํšŒํ•ด์˜ค๋Š” ํ‚ค ๊ฐ’์„ Hash ๊ฐ’์„ ์ด์šฉํ•˜๋ฉฐ
์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ Key & Value ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

ํ•ด์‹œํ•จ์ˆ˜

ํ•ด์‹œ๊ฐ’์„ ์ด์šฉํ•œ ์ž๋ฃŒํ˜•์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋‚˜์˜ค๋Š” ์ธ๋ฑ์Šค ๊ฐ’์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š”๋ฐ ์ด ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ํ•ด์‹œ ํ‚ค๊ฐ’์„ ์ž…๋ ฅ์„ ๋ฐ›์•„ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ƒ์˜ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ด๋Š” ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑ์‹œ์—๋Š” ๋‹ค์Œ ๋‘๊ฐ€์ง€์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”๊ฒƒ์ด ์ œ์ผ ์ข‹๋‹ค.

  1. ์ž…๋ ฅ๋˜๋Š” ์›์†Œ๊ฐ€ ํ•ด์‹œ ํ…Œ์ด๋ธ” ์ „์ฒด์— ๊ณ ๋ฃจ ์ €์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค. (ํ•ด์‹œ ๋ถ„ํฌ)
  2. ๊ณ„์‚ฐ์ด ๊ฐ„๋‹จํ•ด์•ผ ํ•œ๋‹ค (์„ฑ๋Šฅ)

์ฒซ๋ฒˆ์งธ ์กฐ๊ฑด์„ ์ž˜ ๋งŒ์กฑํ•ด์•ผ๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์›์†Œ๊ฐ€ ํ•˜๋‚˜์˜ ํ•ด์‹œ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ถฉ๋Œ๋‚  ํ™•๋ฅ ์ด ์ ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (ํ•ด์‹œ์ถฉ๋Œ)

๋Œ€๋ถ€๋ถ„ ์•„๋ž˜์™€ ๊ฐ™์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

int hashIndex = X.hashCode() % M;

์ด ์ฝ”๋“œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ 1/M ์˜ ํ™•๋ฅ ๋กœ ๊ฐ™์€ ๋ฒ„ํ‚ท์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

ํ•ด์‹œ๋ฅผ ์ด์šฉํ•œ ์ธ๋ฑ์‹ฑ ์‚ฌ์šฉ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ด Key ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ๊ฐ์ฒด์˜ hashCode() ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด ์ž๋ฃŒํ˜•์€ int ๋‹ค

32 bit ์ž๋ฃŒํ˜•์œผ๋กœ๋Š” ์™„์ „ํ•œ ์ž๋ฃŒ์˜ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.
๋…ผ๋ฆฌ์ ์œผ๋กœ 2^32 ๋ณด๋‹ค ๋งŽ์„์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ ํ•ด์‹œ๋ฅผ ์ด์šฉํ•œ Map ๊ฐ์ฒด์—์„œ ๋žœ๋ค ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์›์†Œ๊ฐ€ 2^32 ์ธ ๋ฐฐ์—ด์„ ๋ชจ๋“  Map ์ด ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•ด์‹œ ์ถฉ๋Œ (Hash Colision)

ํ•ด์‹œ ์ถฉ๋Œ (Hash Colision) ์„ ์ž˜ ํšŒํ”ผํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด ๋†“์•˜๋”๋ผ๋„ ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœํ–‰ํ•  ๊ฒฝ์šฐ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค์Œ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋œ๋‹ค.

๋‹ค๋ฅธ ํ•ด์‹œ ํšŒํ”ผ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ์ด ๋‘๊ฐ€์ง€๋ฅผ ์‘์šฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ• (Open Address)

ํ•ด์‹œ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฒ„ํ‚ท (๋ฐ์ดํ„ฐ ์ฃผ์†Œ ๊ณต๊ฐ„) ์„ ์ฐพ์•„ ์ž๋ฃŒ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋น„์–ด์žˆ๋Š” ๋ฒ„ํ‚ท์„ ํƒ์ƒ‰ํ•˜๊ฑฐ๋‚˜ ํ˜น์€ 2์ฐจ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๋Š”๋ฐ
์ด ๊ณผ์ •์—์„œ ์ƒˆ๋กœ์šด ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ Linear Probing, Quadratic Probing ๋“ฑ์˜ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋œ๋‹ค.

  • ์žฅ์ 
    • ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ ๋‹ค๋ฉด ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋‹ค.
  • ๋‹จ์ 
    • ์—ฐ์†๋œ ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ ํšจ์œจ์ด ๋†’๋‹ค.
    • ํฌํ‚ค๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ ์ค‘๋ฅ  (hit ratio) ์ด ๋‚ฎ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ ํšจ์œจ์ด ํ˜„์ €ํžˆ ๋‚ฎ์•„์ง„๋‹ค.

๋ถ„๋ฆฌ ์—ฐ๊ฒฐ๋ฒ• (Seperate Chaining)

Java HashMap ์—์„œ ์‚ฌ์šฉ์ค‘์ธ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ์ƒ์— ์ด์ ์ด ์žˆ๋‹ค.

๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜

์ €์žฅํ•˜๋ ค๋Š” ๋‘ ๊ฐœ๊ฐ€ ๊ฐ™์€ ์ธ๋ฑ์Šค๋กœ ํ•ด์‹ฑ (hashing : hash ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณ„์‚ฐ๋จ์„ ์˜๋ฏธ) ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ™์€๊ณณ์— ์ €์žฅํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.
๋•Œ๋ฌธ์— ํ•ด์‹ฑ๋œ ์ธ๋ฑ์Šค์— ์ด๋ฏธ ๋‹ค๋ฅธ ๊ฐ’๋“ค์ด ๋“ค์–ด์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋‹ค๋ฅธ ์œ„์น˜๋ฅผ ์ฐพ์€๋’ค์—์•ผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์™ธ์—๋„ ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ๋™์  ํ™•์žฅ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ๋™์  ํ™•์žฅ

ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ž‘๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์•„๋‚„์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด์‹œ ์ถฉ๋Œ๋กœ ์ธํ•œ ์„ฑ๋Šฅ์ƒ์˜ ๋น„์šฉ์ด ๋” ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋ฌธ์— HashMap ์€ Key & Value ์˜ ์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์ • ๊ฐœ์ˆ˜ ์ด์ƒ ๋˜๋ฉด ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‘๋ฐฐ๋กœ ๋Š˜๋ฆฐ๋‹ค.

์ด ์ผ์ • ๊ฐœ์ˆ˜๋Š” ๊ธฐ๋ณธ ์•ฝ 75% ์ •๋„๋กœ load factor ๋กœ HashMap ์˜ ์ƒ์„ฑ์ž์—์„œ ์ง€์ •๊ฐ€๋Šฅํ•˜๋‹ค.

/**
 * The load factor used when none specified in constructor.
 */
static final float DEFAULT_LOAD_FACTOR = 0.75f;

ํ•ด์‹œ์˜ ๋‹จ์ 

๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ์ ‘๊ทผํ•˜๋Š”๊ฒƒ์— ์—„์ฒญ๋‚œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.