JAVA :: HashMap, hashing ๊ฐ๋ ์ ๋ฆฌ
HashMap์ด๋?
์ผ๋จ Map์ ํค(Key)์ ๊ฐ(value)์ ๋ฌถ์ด์ ํ๋์ ๋ฐ์ดํฐ(entry)๋ก ์ ์ฅํ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค. ๊ฐ์ ๋งต์ ๋ ๊ฐ ์ด์์ ๊ฐ์ ํค๋ ์กด์ฌํด์๋ ์๋๋ฉฐ, ์ค๋ณต๋ ๊ฐ์ ์กด์ฌํด๋ ๊ด์ฐฎ๋ค. ๋ง์ฝ ์ค๋ณต๋ ํค ๊ฐ์ ๊ฐ์ ์ ์ฅํ๋ ค๊ณ ํ๋ค๋ฉด, ๋์ค์ ์ ์ฅํ ๊ฐ์ด ๊ทธ ํค์ ๊ฐ์ด ๋๋ค. ํด์ฑ์ ๋ํด์ ํ๋ฐ์ ์ ๋ฆฌํ ๊ฒ์ด๋ค.
๐ช HashMap
โพ HashMap ๋ฉ์๋
โพHashMap ๊ฐ ์ถ๊ฐํ๊ณ ์ฝ๊ธฐ
- entrySet() ์ด์ฉ
HashMap map = new HashMap();
map.put("A", 100);
map.put("B", 90);
map.put("C", 80);
Set set = map.entrySet();
Iterator it = set.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
System.out.println("key : " + entry.getKey() + ", value : " + entry.getValue());
}
key : A, value : 100
key : B, value : 90
key : C, value : 80
- keySet(), values() ์ด์ฉ
keySet๊ณผ values๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ์ ๋ฐ๋ก๋ฐ๋ก ๋ถ๋ฌ์ฌ ์ ์๋ค.
set = map.keySet();
System.out.println("keys : " + set);
Collection values = map.values();
System.out.println("values : " + values);
keys : [A, B, C]
values : [100, 90, 80]
- put, get๋ง ์ด์ฉ
ํน์ ํ๋์ ํค์ ๊ฐ์ ๋ถ๋ฌ์ค๊ณ ์ถ์ ๋๋ get์ ์ฌ์ฉํ๋ฉด ๋๋ค.
Integer value = (Integer) map.get("A");
System.out.println(value);
โพ HashMap ๊ฐ ์ ๊ฑฐ
ํน์ ํ ํค์ ๊ฐ์ ์ ๊ฑฐํ๊ณ ์ถ๋ค๋ฉด remove๋ฅผ ์ฌ์ฉํ๊ณ , ๋ชจ๋ ๊ฐ์ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด clear๋ฅผ ์ฌ์ฉํ๋ค.
map.remove("A");
map.clear();
ํด์ฑ์ด๋?
ํด์ํจ์(hash function)์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ํด์ ํ ์ด๋ธ์ ์ ์ฅํด์ ๊ฒ์ํ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค. ํด์ํจ์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ ๋์ด ์๋ ๊ณณ์ ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ ๋ค๋์ ๋ฐ์ดํฐ ์ค์์๋ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
ํด์ฑ์ ๊ตฌํํ ์ปฌ๋ ์ ํด๋์ค๋ก๋ HashSet, HashMap, HashTable์ด ์๋๋ฐ ๊ฐ๋ฅํ๋ฉด HashTable๋ณด๋ค HashMap์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์ ๋ฐฉ๋ฒ์ด ํด์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ค. ํด์ฑ์์ ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ๋ ๋ฐฐ์ด๊ณผ ๋งํฌ๋ ๋ฆฌ์คํธ์ ์กฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
์๋ฅผ ๋ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ํตํด ์ฌ๋์ ์ฐพ๋๋ค๊ณ ํ ๋ ํ์ด๋ ์ฐ๋๋ณ๋ก ์ ๋ฆฌ๋ฅผ ํด๋์ผ๋ฉด ํธํ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ๋งํฌ๋ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์ปค์ง์๋ก ๊ฒ์ ์๋๊ฐ ๋๋ ค์ง๋ค๋ ๋จ์ ์ด ์๋ค.
๊ทธ๋์ ์ ๋ฐฉ๋ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ ํ๋์ ์๋์ ๋ง์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ ํํ๋ณด๋ค๋, ๋ง์ ์๋์ ํ๋์ ๋ฐ์ดํฐ๋ง ์ ์ฅ๋์ด ์๋ ํํ๊ฐ ๋ ๋น ๋ฅธ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
HashMap๊ณผ ๊ฐ์ด ํด์ฑ์ ๊ตฌํํ ์ปฌ๋ ์ ํด๋์ค์์๋ Object ํด๋์ค์ ์ ์๋ hashCode()๋ฅผ ํด์ํจ์๋ก ์ฌ์ฉํ๋ค.
hashCode๋ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์ด์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด์ ์ฝ๋๋ฅผ ๋ง๋ค์ด ๋ธ๋ค.
- String์ ๊ฒฝ์ฐ์๋ Object๋ก๋ถํฐ ์์๋ฐ์ hashCode()๋ฅผ ์ค๋ฒ ๋ผ์ด๋ฉํด์ ๋ฌธ์์ด์ ๋ด์ฉ์ผ๋ก ํด์ ์ฝ๋๋ฅผ ๋ง๋ค์ด๋ธ๋ค. ๊ทธ๋์ ์๋ก ๋ค๋ฅธ String ์ธ์คํด์ค ์ผ์ง๋ผ๋ ๊ฐ์ ๋ด์ฉ์ ๋ฌธ์์ด์ ๊ฐ์ก๋ค๋ฉด hashCode()๋ฅผ ํธ์ถํ๋ฉด ๊ฐ์ ํด์์ฝ๋๋ฅผ ์ป๋๋ค.
HashSet์ด๋ HashMap์์๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ฒด์ ๋ํด equals()๋ก ๋น๊ตํ ๊ฒฐ๊ณผ๊ฐ true์ด๋ฉด์, hashCode()๊น์ง ๊ฐ์์ผ ๊ฐ์ ๊ฐ์ฒด๋ก ์ธ์ํ๋ค.!!
๋ฐ๋ผ์ ์๋ก์ด ํด๋์ค๋ฅผ ์ ์ํ ๋ equals()๋ฅผ ์ฌ์ ์ ์ค๋ฒ ๋ผ์ด๋ฉํด์ผ ํ๋ค๋ฉด hashCode()๋ ๊ฐ์ด ์ฌ์ ์ํด์ค์ผ ํ๋ค โญโญ