์๋ ์ง๋ฌธ์ ๋ํ ๋ต์ ํด๋น ๊ธ ํ๋จ์์ ํ์ธํด ๋ณผ ์ ์๋ค.
1. ์ Map ์ธํฐํ์ด์ค๋ Collection ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ง ์๋๊ฐ?
2. HashMap์ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
3. ์ด๋ ํ ํด๋์ค๋ Map์ Key๋ก ์ฌ์ฉ๋ ์ ์๋๊ฐ?
4. Map ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ๋ ๋ค๋ฅธ Collection ๋ทฐ๋ ๋ฌด์์ธ๊ฐ?
6. HashMap๊ณผ TreeMap์ ๊ฐ๊ฐ ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ๊ฐ?
0. Map ์ธํฐํ์ด์ค ํน์ง
- List, Set, Queue ์ ๊ฐ์ ์ธํฐํ์ด์ค์ ๋ฌ๋ฆฌ Collection ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ง ์์
- key-value ์(Entry) ์ผ๋ก ๋ฐ์ดํฐ ์ ์ฅ
- ์์ ์์
- key ์ค๋ณต ๋ถ๊ฐ/value๋ ์ค๋ณต๋ ์ ์์
์ฌ์ฉ์ ์ฃผ์ํด์ผํ ์
Map ์ธํฐํ์ด์ค ์ฃผ์ ์ฐธ๊ณ
Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map. A special case of this prohibition is that it is not permissible for a map to contain itself as a key. While it is permissible for a map to contain itself as a value, extreme caution is advised: the equals and hashCode methods are no longer well defined on such a map.
Map์ ํค๋ก mutableํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์์ข๋ค! Map์ key์์ ํด์ํจ์๋ฅผ ํตํด ํด์๊ฐ(hash code)์ ์ป๊ณ ๊ทธ์ ํด๋นํ๋ ์์์ value๋ฅผ ์ ์ฅํ๋๋ฐ, key๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํด์๊ฐ๋ ๋ฌ๋ผ์ง๊ฒ ๋๋ค. ๊ทธ๋ผ, ์๋ key์ ํด์๊ฐ์ ๋งคํ๋์ด ์๋ value๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ด ๋งคํ๋๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๊ธธ ์ ์๋ค.
1. Map ์ธํฐํ์ด์ค์ ๊ตฌํ
- HashMap
- LinkedHashMap
- TreeMap(SortedMap์ธํฐํ์ด์ค)
์ด์ธ์๋ HashTable์ด ์์ง๋ง ์ด๋ ๊ณผ๊ฑฐ์ ์ฌ์ฉํ๋ ํด๋์ค๋ก ๋์ด์ ์ง์ํ์ง ์์ผ๋ ์ฌ์ฉ์ ์ง์ํ๋ ๊ฒ์ด ์ข๋ค.
2. Map์ ๊ธฐ๋ณธ ๋ฉ์๋
return value | method | description |
int | size() | key-value ์์ ์, entry์ ์๊ฐ Integer.MAX_VALUE ์ด์์ด๋ฉด Integer.MAX_VALUE ๋ฐํํ๋ค. |
boolean | isEmpty() | key-value ์์ด ์๋ ๊ฒฝ์ฐ true ๋ฐํํ๋ค. |
boolean | containsKey(Object key) | Map์ ์ง์ ํ ํค๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ true ๋ฐํํ๋ค. |
boolean | containsValue(Object value) | Map์ ์ง์ ํ ๊ฐ์ด ํฌํจ๋ ๊ฒฝ์ฐ true ๋ฐํ ์ด ์ฐ์ฐ์ Map ํฌ๊ธฐ์ ํด๋นํ๋ ์ ํ์๊ฐ์ด ํ์ํ๋ค. |
V | get(Object key) | key์ ํด๋นํ๋ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ๋งคํ๋๋ ๊ฐ์ด ์์ผ๋ฉด null ๋ฐํํ๋ค. Map์ null๊ฐ์ ๋ช ์์ ์ผ๋ก ํ์ฉํ ์ ์์ผ๋ฏ๋ก null์ด ๋ฐํ๋๋๋ผ๋ ํด๋น ํค์ ๋งคํ๋๋ ๊ฐ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋ค. |
V | put(K key, V value) | key์ value๊ฐ ๋งคํ๋๋ค. ์ด์ ์ key์ ๋ํ ๋งคํ์ด ์๋ ๊ฒฝ์ฐ ์ด์ ๊ฐ์ updateํ-๋ค. |
V | remove(Object key) | ์ง์ ํ key์ ๋ํ ๋งคํ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ํด๋น ๋งคํ์ ์ ๊ฑฐํ๋ค. |
void | putAll(Map<? extends K, ? extends V> m) | ์ง์ ํ Map์ ๋ชจ๋ ๋งคํ์ ๋ณต์ฌํ๋ค. |
void | clear | Map ๋ด์ ๋ชจ๋ ๋งคํ์ ์ ๊ฑฐํ๋ค. |
Set<K> | keySet() | Map์ ํฌํจ๋ key๋ค์ Set ๋ทฐ๋ฅผ ์ ๊ณตํ๋ค. Map์ ๋ณ๊ฒฝ ๋ด์ฉ์ด Set์๋ ๋ฐ์๋๊ณ ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ํด๋น Set ๋ทฐ์์ ์์๋ฅผ ์ญ์ ํ๋ ์ฐ์ฐ(remove, removeAll, retainAll, clear)์ ํ์ฉ๋๋ฉฐ ์ด ์ฐ์ฐ์ด Map์๋ ๋ฐ์๋์ง๋ง ์ถ๊ฐํ๋ ์ฐ์ฐ(add, addAll)์ ์ง์๋์ง ์๋๋ค. |
Collection<V> | values() | Map์ ํฌํจ๋ value๋ค์ Collection ๋ทฐ๋ฅผ ์ ๊ณตํ๋ค. Map์ ๋ณ๊ฒฝ ๋ด์ฉ์ด Collection ๋ทฐ์๋ ๋ฐ์๋๊ณ ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ํด๋น Collection ๋ทฐ์์ ์์๋ฅผ ์ญ์ ํ๋ ์ฐ์ฐ์ ํ์ฉ๋๋ฉฐ ์ด ์ฐ์ฐ์ด Map์๋ ๋ฐ์๋์ง๋ง ์ถ๊ฐํ๋ ์ฐ์ฐ์ ์ง์๋์ง ์๋๋ค. |
Set<Map,.Entry<K, V>> | entrySet() | Map์ ํฌํจ๋ ๋งคํ์ Set ๋ทฐ๋ฅผ ๋ฐํํ๋ค. Map์ ๋ณ๊ฒฝ ๋ด์ฉ์ด Set ๋ทฐ์๋ ๋ฐ์๋๊ณ ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ํด๋น Set ๋ทฐ์์ ์์๋ฅผ ์ญ์ ํ๋ ์ฐ์ฐ(remove, removeAll, retainAll, clear)์ ํ์ฉ๋๋ฉฐ ์ด ์ฐ์ฐ์ด Map์๋ ๋ฐ์๋์ง๋ง ์ถ๊ฐํ๋ ์ฐ์ฐ(add, addAll)์ ์ง์๋์ง ์๋๋ค. |
์ด์ธ์๋ Entry(key-value ์) ์ธํฐํ์ด์ค์ ์ ์๋ ์ ์ฉํ๊ฒ ์ฐ์ผ๋งํ ๋ฉ์๋๋ ์๋์ ๊ฐ๋ค.
return value | method | description |
V | getOrDefault(Object key, V defaultValue) | ์ง์ ํ key์ ๋งคํ๋ value๋ฅผ ๋ฐํํ๊ฑฐ๋, ๋งคํ์ด ์๋ ๊ฒฝ์ฐ ์ง์ ํ defaultValue๋ฅผ ๋ฐํํ๋ค. |
๊ฐ ๊ตฌํ์ฒด์ ๋ํ ์ค๋ช ์ ์์, ์๋์์ ์ฌ์ฉ๋ ์ฉ์ด ์ค "๋ฒํท"์ ๋ํด์ ์ ๋ฆฌํ๊ณ ๊ฐ์.
๋ฒํท(bucket)? ํด์ ํจ์๋ฅผ ํตํด ๊ณ์ฐ๋ ํค์ ํด์๊ฐ์ ๋ฐ๋ผ ๋งคํ๋ ๊ฐ๋ค์ด ์ ์ฅ๋๋ ์์น
์ผ๋ฐ์ ์ผ๋ก, ํด์ ํ ์ด๋ธ์ด ๋ฐฐ์ด๋ก ๊ตฌํ๋๋ฉฐ ๊ฐ ๋ฐฐ์ด์ ์์๋ฅผ ๋ฒํท์ด๋ผ๊ณ ํ๋ค.
3. HashMap
- ํด์ํจ์๋ฅผ ์ด์ฉํ Map - key์ ํด์๊ฐ(hash code)์ ์ฌ์ฉํ์ฌ value๋ฅผ ์ ์ฅ, ๊ฐ ํด์๊ฐ(hash code)์ ํด์ ํ ์ด๋ธ(๋ฐฐ์ด๋ก ๊ตฌํ๋จ)์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉ๋๋ฉฐ ํด๋น ์ธ๋ฑ์ค์ ์์์ value๊ฐ ์ ์ฅ๋๋ค.
- ์ฝ์ /๊ฒ์/์ญ์ ์ฐ์ฐ์ ์๊ฐ๋ณต์ก๋: O(1)
- ์ฝ์ ํ ๋ฐ์ดํฐ์ ์์๋ฅผ ๋ณด์ฅํ์ง ์์(์์๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด LinkedHashMap์ ์ฌ์ฉํด์ผํจ)
- ์ ๋ ฌ์ด ๋ถ๊ฐ(์ ๋ ฌ์ ์ํด์๋ TreeMap์ ์ฌ์ฉํด์ผํจ)
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
static final float DEFAULT_LOAD_FACTOR = 0.75f;โ
๊ธฐ๋ณธ ์์ฑ์์ ์ํด HashMap๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ HashMap์ ์ด๊ธฐ ์ฉ๋์ 16์ด๋ฉฐ ์ด๊ธฐ ์ ์ฌ์จ์ 0.75์ผ๋ก ์ ์๋์ด ์๋ค.
์ฌ๊ธฐ์, ์ ์ฌ์จ(load factor)์ ํด์ ํ ์ด๋ธ ํฌ๊ธฐ ๋๋น ํค์ ๊ฐ์ ๋น์จ์ ์๋ฏธํ๋ค. ๋ง์ฝ ์ฉ๋์ด 4์ธ๋ฐ 3๊ฐ์ ํค๊ฐ ์์ธ ๊ฒฝ์ฐ ์ ์ฌ์จ์ด 75%(3/4)๋ผ๊ณ ๋ณผ ์ ์๋ค.
Map์ ์์๊ฐ ์ถ๊ฐ๋๋ฉด์ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋์ด ์๋ ์ฉ๋์ ๋ฒ์ด๋๊ฒ ๋๋ ๊ฒฝ์ฐ resize๋ฅผ ์ํํ๋๋ฐ resize๋ฅผ ์ํํ ๋๋ง๋ค ์ฉ๋์ 2๋ฐฐ ๋์ด๋๊ฒ ๋๋ค. ( ์๋ ์ฝ๋์์ newThr = oldThr << 1; ๋ถ๋ถ ์ฐธ๊ณ )
final Node<K,V>[] resize() {
Node<K,V>[] oldTab = table;
int oldCap = (oldTab == null) ? 0 : oldTab.length;
int oldThr = threshold;
int newCap, newThr = 0;
if (oldCap > 0) {
if (oldCap >= MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return oldTab;
}
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
oldCap >= DEFAULT_INITIAL_CAPACITY)
newThr = oldThr << 1; // double threshold
}
else if (oldThr > 0) // initial capacity was placed in threshold
newCap = oldThr;
else { // zero initial threshold signifies using defaults
newCap = DEFAULT_INITIAL_CAPACITY;
newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
}
if (newThr == 0) {
float ft = (float)newCap * loadFactor;
newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
(int)ft : Integer.MAX_VALUE);
}
threshold = newThr;
4. LinkedHashMap
- ํด์ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ฒฐํฉํ์ฌ key-value ์์ ์ ์ฅ - ํด์ ํ ์ด๋ธ์ ๊ฐ ๋ฒํท์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ ์ ์ฅ, (1) key๋ฅผ ํด์ํจ์๋ฅผ ์ด์ฉํ์ฌ hash code๋ก ๋ณํ, (2) ํด๋น ํด์๊ฐ์ ๋์ํ๋ ๋ฒํท์ key-value ์์ ์ ์ฅ, (3) ๋์ผ ํด์๊ฐ์ ๋์ ํ๋ ๋ฒํท์ ์ด๋ฏธ ๋ค๋ฅธ key-value ์์ด ์ ์ฅ๋ ๊ฒฝ์ฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ง์ง๋ง์ ์๋ก์ด ์ํธ๋ฆฌ ์ถ๊ฐ
- ์ ๋ ฅ ์์ ํน์ ์ ๊ทผ ์์๊ฐ ์ ์ง
- ์ฝ์ /์ญ์ ๊ฐ ์ผ๋ฐ Map๋ณด๋ค ๋๋ฆผ
- LRU(Latest Recently Used) ์บ์์ ๊ฐ์ ์บ์ ๊ตฌํ์ฒด๋ก ์ฌ์ฉ๋ ์ ์๋ค.
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
/**
* The head (eldest) of the doubly linked list.
*/
transient LinkedHashMap.Entry<K,V> head;
/**
* The tail (youngest) of the doubly linked list.
*/
transient LinkedHashMap.Entry<K,V> tail;
LinkedHashMap์์ ์ ์๋ Entry ํด๋์ค์ด๋ค. ๊ฐ Entry๋ ์ด์ (before)๊ณผ ์ดํ(after)์ ๋ํ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๋ฉฐ LinkedHashMap์์ head, tail ์ํธ๋ฆฌ๋ฅผ ๊ฐ์ง ๊ฒ์ผ๋ก ๋ณด์ ๋ด๋ถ์ ์ผ๋ก ํด์ํ ์ด๋ธ์ด ์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํ๋์ด ์์์ ์ ์ ์๋ค.
Entry ํด๋์ค์์ ๊ฐ๊ฐ์ ๋ณ์๊ฐ ์๋ฏธํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- before: ํด๋น ๋ ธ๋ ์์ ์ฝ์ ๋ ๋ ธ๋
- after: ํด๋น ๋ ธ๋ ๋ค์ ์ฝ์ ๋ ๋ ธ๋
- key: ํค
- value: ๊ฐ
- next: ๋์ผํ ๋ฒํท์ ์๋ ๋ค์ ๋ ธ๋
LinkedHashMap์์ ๋์ผ ๋ฒํท์ ๋ํด ๋ค๋ฅธ Entry๋ฅผ ๊ฐ์ง์ ์์ผ๋ฉด์ ์์๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๋์ง ๊ถ๊ธํ๋๋ฐ Entry ํด๋์ค์ ์ ์ ๋ด์ฉ์ ๋ณด๋ฉด ๋ต์ ์ป์ ์ ์์๋ค.
before, after ์ํธ๋ฆฌ๋ ์์ ๋ณด์ฅ์ ์ํ ํฌ์ธํฐ์ด๊ณ next๋ ๋์ผ ๋ฒํท์ ๋ํ ์ฐ๊ฒฐ๋ Entry์ ๋ํ ํฌ์ธํฐ๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค.
5. TreeMap
- ์ด์ง๊ฒ์ํธ๋ฆฌ(binary search tree)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ Map - ๊ฐ ๋ ธ๋์ key๋ฅผ ์ด์ฉํ์ฌ key-value ์์ ์ ์ฅํ๊ณ ๊ฒ์
- ํค๊ฐ ํญ์ ์ ๋ ฌ๋ ์์๋ก ์ ์ง
- ํค์ ๊ฐ์ด ์ ์ฅ๋ Map Entry๋ฅผ ์ ์ฅ
- ์ถ๊ฐ๋ ์ญ์ ์ ์ ๋ ฌ ์ํ(๋ ๋-๋ธ๋ ํธ๋ฆฌ๋ฅผ ์ ์งํ๊ธฐ ์ํด์) → HashMap๋ณด๋ค Map ์ฑ๋ฅ์ด ๋จ์ด์ง, O(logN) ์ ์๊ฐ๋ณต์ก๋
- ์ ๋ ฌ ์์: ๋ถ๋ชจ๋ ธ๋์ ํค๊ฐ๋ณด๋ค ์์ ํค๊ฐ์ ์ผ์ชฝ ์์ ์๋ธํธ๋ฆฌ๋ก/๋ถ๋ชจ๋ ธ๋์ ํค๊ฐ๋ณด๋ค ํฐ ํค๊ฐ์ ์ค๋ฅธ์ชฝ ์์ ์๋ธํธ๋ฆฌ๋ก
- key ๋น๊ต๋ฅผ ์ํด Comparable ์ธํฐํ์ด์ค ํน์ Comparator ์ธํฐํ์ด์ค ๊ตฌํ์ด ํ์, natural ordering์ด ๊ธฐ๋ณธ
- key์ ์์๊ฐ ์ค์ํ๊ณ ๊ฒ์ ์๋๊ฐ ์ค์ํ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
์ด์งํธ๋ฆฌ์ ๋ฌธ์ ์
- TreeMap์์๋ ์ด์งํธ๋ฆฌ์์ ๋ฐ์ํ ์ ์๋ ํธํฅ ๋ฌธ์ ๋ฅผ ๋ ๋-๋ธ๋ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ๋ค.
- ๋ ๋-๋ธ๋ ํธ๋ฆฌ๋ ํธ๋ฆฌ๊ฐ ํธํฅ๋์ง ์๋๋ก Recoloring, Restructuring์ ํตํด์ ๊ท ํ๋ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ ์งํ๋ค.
- ์ Map ์ธํฐํ์ด์ค๋ Collection ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ง ์๋๊ฐ?
- Map๊ณผ Collection์ ์์๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ค. Collectin์ ๊ฐ์ฒด์ ๋ชจ์์ ๋ค๋ฃจ๋ ์ธํฐํ์ด์ค๋ก์ ์ผ๋ฐ์ ์ผ๋ก ์์๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์๋ค. ๋ฐ๋ฉด, Map์ key-value ์์ ๋ค๋ฃจ๋ ์ธํฐํ์ด์ค๋ก์ ๊ฐ key์ ๋์ํ๋ value๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ํ, Map์ ์์๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ๋ณด๋ค key๋ฅผ ์ด์ฉํ ๊ฒ์์ ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์๋ค. ์ถ๊ฐ์ ์ผ๋ก, Java 8 ๋ถํฐ๋ Map ์ธํฐํ์ด์ค์ forEach() ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ฌ Collection ์ธํฐํ์ด์ค์ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ๊ฐ์ ๋์๋ค.
- HashMap์ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
- HashMap์ Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค ์ค ํ๋๋ก์ key-value ์์ ์ ์ฅํ๋ ํด์ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค. HashMap์์ ๊ฐ ์ํธ๋ฆฌ๋ key์ value์ ์์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ key์ ํด์๊ฐ์ ํตํด ๋ฒํท์ ์ ์ฅ๋๋ค. ํด์๊ฐ์ hashCode() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ณ์ฐ๋๋ฉฐ, ๋์ผํ key ๊ฐ์ฒด์ ๋ํด์๋ ํญ์ ๋์ผํ ํด์๊ฐ์ด ๋ฐํ๋๋ค.
- get() ๋ฉ์๋ ํธ์ถ์ hashCode() ๋ฉ์๋๋ฅผ ํธ์ถํด ํด์๊ฐ์ ์ฐพ๊ณ equals() ๋ฉ์๋๋ฅผ ํตํด ์ฐพ์ผ๋ ค๊ณ ํ๋ key์ ๋์ผํ์ง ํ์ธํ๋ค.
- put() ๋ฉ์๋ ํธ์ถ์ hashCode() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ Map์ ๋์ผํ key๊ฐ ์๋์ง ์ฐพ๋๋ค. ๋ง์ฝ, ์กด์ฌํ๋ Entry์ธ ๊ฒฝ์ฐ equals() ๋ฉ์๋๋ฅผ ํตํด key๊ฐ ์ด๋ฏธ ์กดํด์๋์ง ํ์ธํ๊ณ ์กด์ฌํ๋ค๋ฉด ๋ฎ์ด์ด๋ค.
- ํด์๊ฐ์ด ์ถฉ๋ํ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ ๋ฒํท์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ key-value ์์ ์ ์ฅํ๋ค. ์ต๋ํ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ก ์ ์ ํ ์ด๊ธฐ ์ฉ๋๊ณผ ๋ก๋ ํฉํฐ๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- HashMap์ ์ฝ์ , ๊ฒ์, ์ญ์ ์ฐ์ฐ์ ๋ํด O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฉฐ, ํด์์ถฉ๋์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์ต๋ O(N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ์ด๋ ํ ํด๋์ค๋ Map์ Key๋ก ์ฌ์ฉ๋ ์ ์๋๊ฐ?
- ์ด๋ค ํด๋์ค๋ Map์ key๋ก ์ฌ์ฉ๋ ์ ์์ง๋ง, ํด๋น ํด๋์ค๋ ๋ฐ๋์ hashCode()์ equals() ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ฉฐ ๋ถ๋ณํด๋์ค๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ข๋ค.
- Mutabl ๊ฐ์ฒด๋ฅผ Key๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ธกํ์ง ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ค. Map์ key๋ก ์ฌ์ฉ๋ ๊ฐ์ฒด ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด hashCode() ๋ฉ์๋ ๋ฐํ๊ฐ๋ ๋ณ๊ฒฝ๋๋ค. ํด๋น key๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํด์ ํ ์ด๋ธ์์ key์ ์์น๊ฐ ๋ณ๊ฒฝ๋์ด ๊ฒ์์ด ์คํจํ๊ฑฐ๋ ๋ค๋ฅธ key๋ฅผ ์ฐพ๊ฒ ๋ ์ ์๋ค.
- ๋ํ, ์ ๋ ฌ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ๋๋ Comparable ๋๋ Comparator ์ธํฐํ์ด์ค์ compareTo() ๋ฉ์๋๋ compre() ๋ฉ์๋์ ๋ฐํ๊ฐ๋ ๋ณ๊ฒฝ๋ ์ ์๋ค.
- Map ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ๋ ๋ค๋ฅธ Collection ๋ทฐ๋ ๋ฌด์์ธ๊ฐ?
- keySet() ๋ฉ์๋: Map์ ์ ์ฅ๋ key๋ค์ Set ๋ทฐ ๋ฐํ
- values() ๋ฉ์๋: Map์ ์ ์ฅ๋ Collection ๋ทฐ ๋ฐํ
- entrySet() ๋ฉ์๋: Map์ ์ ์ฅ๋ key-value ์๋ค์ Set ๋ทฐ ๋ฐํ
- ์ Collection ๋ทฐ๋ค์ ํตํด Map์ ์ ์ฅ๋ key, value, key-value ์๋ค์ ๋ค๋ฃฐ ์ ์๋ค.
- HashMap๊ณผ TreeMap์ ๊ฐ๊ฐ ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ๊ฐ?
- HashMap๊ณผ TreeMap์ ํฌ๊ฒ ๋ฐ์ดํฐ ์ ๋ ฌ ๋ฐฉ์, ์๋์์ ์ฐจ์ด๋ฅผ ๊ฐ์ง๋ค.
- ๋ฐ์ดํฐ ์ ๋ ฌ ๋ฐฉ์: HashMap์ ๋ฐ์ดํฐ ์์๋ฅผ ๋ณด์ฅํ์ง ์์๋ฐ ๋ฐํด TreeMap์ key๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ์์๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
- ์๋: HashMap์ ํด์ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก ์ฝ์ , ๊ฒ์, ์ญ์ ์ฐ์ฐ์ O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ณด์ฅํ๋ค. ๋ฐ๋ฉด, TreeMap์ ์ด์ง๊ฒ์ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก ์ฝ์ , ๊ฒ์, ์ญ์ ์ฐ์ฐ์ O(logN)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ๋ฐ๋ผ์, ๋ฐ์ดํฐ์ ์์๊ฐ ์ค์ํ์ง ์์ ๊ฒฝ์ฐ ํน์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ๋๋ HashMap์
- ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ๋ ์ํ๋ก ์ ์งํด์ผ ํ๊ฑฐ๋ ํน์ ํค๊ฐ์ ๋ํ ๊ฒ์ ์ฐ์ฐ์ด ๋ง์ ๊ฒฝ์ฐ, key์ ์์ฐ์ ์ธ ์์๋ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ฌ์ฉ์ ์ ์ ํด๋์ค๋ฅผ key๋ก ์ฌ์ฉํ ๋๋ TreeMap์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
'๊ฐ๋ฐ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Collection Framework - List์ ๊ตฌํ์ฒด(๊ธฐ๋ณธ) (0) | 2023.04.29 |
---|---|
[Java] ์ถ์ํด๋์ค์ ์ธํฐํ์ด์ค (0) | 2023.04.26 |
[Java] Collection Framework - Set์ ๊ตฌํ์ฒด(๊ธฐ๋ณธ) (0) | 2023.04.25 |
[Java] Collection Framework - Map์ ๊ตฌํ์ฒด(์ฌํ) (0) | 2023.04.21 |