โ๏ธ Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ Collection ํด๋์ค.
โ๏ธ ๋ฐ์ดํฐ๋ฅผ ํค์ ๊ฐ์ ์์ผ๋ก ์ ์ฅํ๋ค.
โ๏ธ HashMap(๋๊ธฐํ X)์ Hashtable(๋๊ธฐํ O)์ ์ ๋ฒ์ ์ด๋ค.
์์๋ฅผ ์ ์งํ๋ ค๋ฉด, LinkedHashMap
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable {
transient Entry[] table;
...
static class Entry implements Map.Entry {
final Object key;
Object value;
...
}
}
โ๏ธ
Map.Entry
๋ Map์ธํฐํ์ด์ค์ ์ ์๋ static inner interface์ด๋ค.
โ๏ธMap.Entry
๋ ํค์ ๊ฐ์ ํ๋์ ํด๋์ค์ ํจ๊ป ์ ์ฅํ๋ฏ๋ก ๋ ๋ค ๋จ์ผ ์์ ์ผ๋ก ๊ฐ์ ธ์จ๋ค.
โ๏ธ ํค(key): ์ปฌ๋ ์ ๋ด์ key ์ค์์ ์ ์ผํด์ผ ํ๋ค.
โ๏ธ ๊ฐ(value): key์ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ์ ์ค๋ณต์ ํ์ฉํ๋ค.
HashMap map = new HashMap();
map.put("myId", "1234");
map.put("asdf", "1111");
map.put("asdf", "1234");
โ๏ธ ํค ๊ฐ์ ๋ฃ์ผ๋ฉด index(์ ์ฅ ๊ณต๊ฐ)๋ฅผ ์๋ ค์ค๋ค.
โ๏ธ ํด์ํจ์(hash function)๋ก
HashMap
์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ๊ฒ์ํ๋ค.
โ๏ธ
HashMap
์ ๋ฐฐ์ด๊ณผLinkedList
๊ฐ ์กฐํฉ๋ ํํ์ด๋ค.
๋ณ๊ฒฝํ๊ธฐ ์ฝ๊ณ ์ธ๋ฑ์ค๋ง ์๋ฉด ํ๋ฒ์ ์ฐพ์๊ฐ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด๊ณผ LinkedList๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
1. key๋ก ํด์ฌํจ์๋ฅผ ํธ์ถํด์ ํด์์ฝ๋๋ฅผ ์ป๋๋ค.
2. ํด์์ฝ๋(ํด์ํจ์์ ๋ฐํ๊ฐ)์ ๋์ํ๋ LinkedList๋ฅผ ๋ฐฐ์ด์์ ์ฐพ๋๋ค.
3. LinkedList์์ key์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.
โ๏ธ ํด์ํจ์๋ ๊ฐ์ ํค์ ๋ํด ํญ์ ๊ฐ์ ํด์์ฝ๋๋ฅผ ๋ฐํํด์ผ ํ๋ค.
์๋ก ๋ค๋ฅธ ํค์ผ์ง๋ผ๋ ๊ฐ์ ๊ฐ์ ํด์์ฝ๋๋ฅผ ๋ฐํํ ์๋ ์๋ค.
โ๏ธ load factor?
- ์ ์ฅ๊ณต๊ฐ์ด ๊ฐ๋ ์ฐจ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ฉ๋์ ํ๋ณดํ๊ธฐ ์ํ ๊ฒ
- ์ ์ฅ๊ณต๊ฐ์ด 70%๊ฐ ์ฑ์์ก์ ๋ ์ฉ๋์ด 2๋ฐฐ๋ก ๋์ด๋๋ค.
- ์ง์ ํ์ง ์์์ ๋๋ ๋ํดํธ ๊ฐ์ 75%๋ก load Factor๊ฐ 0.75์ด๋ค.
import java.util.*;
public class HashMapEx2 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("jipark09", "0922");
map.put("park", "1111");
map.put("smpark07", "0725");
System.out.println(map);
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("id์ password๋ฅผ ์
๋ ฅํด์ฃผ์ธ์");
System.out.println("id: ");
String id = sc.nextLine().trim();
System.out.println("password: ");
String password = sc.nextLine().trim();
System.out.println();
if(!map.containsKey(id)) {
System.out.println("์
๋ ฅํ์ id๋ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ค์ ์
๋ ฅํด์ฃผ์ธ์");
continue;
}
if(!(map.get(id)).equals(password)) {
System.out.println("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค. ๋ค์ ์
๋ ฅํด์ฃผ์ธ์");
continue;
} else {
System.out.println("ํ์ํฉ๋๋ค!");
break;
}
}
}
}
import java.util.*;
public class HashMapEx3 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("๊น์๋ฐ", new Integer(90));
map.put("๊น์๋ฐ", new Integer(100));
map.put("์ด์๋ฐ", new Integer(100));
map.put("๊ฐ์๋ฐ", new Integer(80));
map.put("๋ฐ์๋ฐ", new Integer(90));
Set set = map.entrySet(); // iterator()๋ฅผ ์ฐ๊ธฐ ์ํด
Iterator it = set.iterator();
while(it.hasNext()) {
// Entry ํด๋์ค๋ ํค์ ๊ฐ์ ํ๋์ ํด๋์ค์ ํจ๊ป ์ ์ฅํ๋ฏ๋ก ๋์์ ํค์ ๊ฐ์ ๋ถ๋ฌ์ฌ ์ ์๋ค.
Map.Entry e = (Map.Entry)it.next();
System.out.println("์ด๋ฆ: " + e.getKey() + " [์ ์: " + e.getValue() + "]");
}
set = map.keySet();
System.out.println("์ฐธ๊ฐ์ ๋ช
๋จ: " + set);
Collection values = map.values();
it = values.iterator();
int total = 0;
while(it.hasNext()) {
int i = (int)it.next();
total += i;
}
System.out.println("์ด์ : " + total);
System.out.println("ํ๊ท : " + (double)total / set.size());
System.out.println("์ต๊ณ ์ ์: " + Collections.max(values));
System.out.println("์ต์ ์ ์: " + Collections.min(values));
}
}
์ด๋ฆ: ๊น์๋ฐ [์ ์: 100]
์ด๋ฆ: ๋ฐ์๋ฐ [์ ์: 90]
์ด๋ฆ: ๊ฐ์๋ฐ [์ ์: 80]
์ด๋ฆ: ์ด์๋ฐ [์ ์: 100]
์ฐธ๊ฐ์ ๋ช
๋จ: [๊น์๋ฐ, ๋ฐ์๋ฐ, ๊ฐ์๋ฐ, ์ด์๋ฐ]
์ด์ : 370
ํ๊ท : 92.5
์ต๊ณ ์ ์: 100
์ต์ ์ ์: 80
References
: https://cafe.naver.com/javachobostudy
: https://staticclass.tistory.com/108 (์์ฑ์ / ๋ฉ์๋ ์ฌ์ง ์ถ์ฒ)