π Map(HashMap)
Javaμμ κ°μ₯ λ§μ΄ μ¬μ©νλ μλ£κ΅¬μ‘°λ Listμ Mapμ΄ μλκΉ μκ°ν©λλ€.
μ΄λμμλ κ΅μ₯ν λ§μ΄ νμ©νλ μλ£κ΅¬μ‘°λ‘ μ λν λ§μ΄ μ¬μ©νλλ°μ, μ΄λ²μλ Map μΈν°νμ΄μ€μ κ°λ κ³Ό μ 곡λλ APIλ€, ꡬνμ²΄μΈ HashMapμ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
(μμ μ½λλ κΉνλΈμμ νμΈνμ€ μ μμΌλ©°, λ²μ μ Java 11μ μ¬μ©νμ΅λλ€.)
Map μΈν°νμ΄μ€λ Collection νλ μμν¬μλ λ€λ₯΄κ² ν€μ κ°μ νλμ μμΌλ‘ μ μ₯νλ Key-Value νμμ μλ£κ΅¬μ‘° μ λλ€.
Keyλ μ΄λ¦ κ·Έλλ‘ κ°(Value)μ μ°ΎκΈ° μν μν μ νλ©° Map μΈν°νμ΄μ€μ key, valueλ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§κ³ μμ΅λλ€.
- keyλ μ€λ³΅μ΄ λΆκ°λ₯νμ§λ§, valueλ μ€λ³΅μ΄ κ°λ₯ν©λλ€.
- κ° keyλ μ΅λ νλμ valueμ 맀νλ μ μμ΅λλ€.
- μΌλ°μ μΌλ‘ μμμ μμλ μ μ§νμ§ μμ΅λλ€.
- Map 컬λ μ μ μνλ ν΄λμ€λ HashMap, LinkedHashMap, Hashtable, TreeMap λ±μ ꡬν ν΄λμ€κ° μμ΅λλ€.
κ°μΈμ μΌλ‘ Map μΈν°νμ΄μ€μ ꡬνμ²΄λ‘ λκΈ°νκ° νμν μΌλΆ μΌμ΄μ€λ ConcurrentHashMapμ, Keyμ μμκ° νμν κ²½μ° TreeMapμ κ·Έ μΈμ μΌμ΄μ€λ HashMapμ μ¬μ©μ νλ κ² κ°μ΅λλ€.
Map μΈν°νμ΄μ€μ μ‘΄μ¬νλ μΆμ λ©μλ, default λ©μλ λͺ©λ‘ μ λλ€.
(μ°Έκ³ λ‘ of λ©μλμ κ²½μ° Java 9μμ μΆκ°λ ν©ν 리 μμ±μ λ©μλλ‘ μμ μ΄ λΆκ°λ₯ν Mapμ μμ±ν©λλ€.)
μ ν μ€νΈ μ²λΌ Map.of() λ©μλλ₯Ό ν΅ν΄ μμ±ν κ°μ²΄λ₯Ό λ³κ²½(put)ν λ UnsupportedOperationException μμΈκ° λ°μν©λλ€.
β» μΈν 리μ μ΄ κ°μ λλν IDEκ° κ²½κ³ λ₯Ό λνλ΄μ£Όκ³ μκΈ΄νμ§λ§, κ°μΈμ μΈ μκ°μΌλ‘λ μ½νλ¦°μ Listλ Mapμ²λΌ λ°μ΄ν°λ₯Ό μΆκ°νκ±°λ μμ νλ put(), add(), remove() λ±μ λ©μλλ₯Ό μ μ΄μ μ 곡νμ§ μλλ‘ κ°μ νμ¬ μ»΄νμΌ νμμμ νμΈμ΄ κ°λ₯νμΌλ©΄ μ΄λ μκΉ νλ μκ°μ΄ λλ€μ.. π―
ImmutableCollections ν΄λμ€λ λΆλ³ 컬λ μ μ μν 컨ν μ΄λ ν΄λμ€μ λλ€. μ¦, MapλΏλ§ μλλΌ List, Set λ±μ λν΄ λΆλ³ κ°μ²΄λ₯Ό μμ±νλ μμ±μλ μ‘΄μ¬ν©λλ€.
π HashMap μ€λͺ
Mapμ ꡬν체 μ€ κ°μ₯ λ§μ΄ μ¬μ©νλ HashMapμ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
HashMap ν΄λμ€μ μ€λͺ μ λν μ£Όμλ¬ΈμΈλ°μ, κ΅μ₯ν κΈΈκΈ°λλ¬Έμ κ°λ΅ν μ 리νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
- Map μΈν°νμ΄μ€μ Hashtable κΈ°λ° κ΅¬ν체
- μ΄ κ΅¬ν체(HashMap)λ keyμ valueκ° nullμ νμ©ν¨
- λκΈ°νλμ§ μκ³ nullμ νμ©νλ€λ μ μ μ μΈνλ©΄ Hashtableκ³Ό κ±°μ λμΌν¨
- μμλ₯Ό μ μ§νμ§ μμ
- ν΄μ ν¨μκ° λ²ν· κ° μμλ₯Ό μ μ ν λΆμ°νλ€κ³ κ°μ ν λ κΈ°λ³Έ μμ (get, put)μ λν΄ O(1) μ 곡
- λ°λ³΅ μ±λ₯μ΄ μ€μν κ²½μ° μ΄κΈ° μ©λμ λ무 λκ² μ€μ νμ§ μλ κ²μ΄ λ§€μ° μ€μν¨
- HashMap μΈμ€ν΄μ€λ μ±λ₯μ μν₯μ λ―ΈμΉλ λ κ°μ§ 맀κ°λ³μ: μ΄κΈ° μ©λ, λΆν κ³μκ° μ‘΄μ¬ν¨
- μ©λμ ν΄μ ν μ΄λΈμ λ²ν· μλ₯Ό λνλ΄λ©°, μ΄κΈ° μ©λμ ν΄μ ν μ΄λΈμ μμ±ν λμ μ©λ
- λΆνμ¨μ μ©λμ΄ μλμΌλ‘ μ¦κ°νκΈ° μ ν΄μ ν μ΄λΈμ΄ μΌλ§λ κ½ μ°° μ μλμ§λ₯Ό λνλ΄λ μ²λ
- ν΄μ ν μ΄λΈμ νλͺ© μ > νμ¬ μ©λ * λ‘λ ν©ν° μΌ κ²½μ°, ν΄μ ν μ΄λΈμ μ¬ν΄μλμ΄ ν΄μ ν μ΄λΈμ λ²ν· μκ° μ½ λ λ°° μ¦κ°
- μΌλ°μ μΌλ‘ κΈ°λ³Έ λΆν κ³μ(0.75)λ μκ°κ³Ό κ³΅κ° λΉμ© κ° μ’μ κ· νμ μ 곡
- HashMap μΈμ€ν΄μ€μ λ§μ 맀νμ΄ μ μ₯λ κ²½μ°, μΆ©λΆν ν° μ©λμΌλ‘ μμ±νλ©΄ ν μ΄λΈ νμ₯ μ νμν μλ μ¬ν΄μ±μ μννλ κ²λ³΄λ€ λ ν¨μ¨μ μΌλ‘ 맀νμ μ μ₯ν μ μμ
- λκΈ°νκ° λμ§ μκΈ° λλ¬Έμ νμν κ²½μ° μΈλΆμ μΌλ‘ λκΈ°νλ₯Ό ν΄μΌ ν¨
- λκΈ°νκ° νμν κ²½μ° μ»¬λ μ
μ μ¬μ©νμ¬ Collections.synchronizedMap λ©μλλ₯Ό ν΅ν΄ Mapμ Wrapped ν΄μΌ ν¨
- Collections.synchronizedMapμ κ²½μ°, synchronizedList() μ²λΌ λ΄λΆ λ‘μ§μ λλΆλΆ synchronized λΈλμΌλ‘ ꡬνμ΄ λμ΄ μμ΅λλ€.
- μ£Όμμλ μμ§λ§ ConcurrentHashMap ν΄λμ€λ₯Ό μ¬μ©νλ λ°©λ²λ μμ κ² κ°μ΅λλ€.
μκ³ μλ λ΄μ©λ μκ³ μ²μ 보λ λ΄μ©λ λ§μ΄ μ‘΄μ¬νλλ°μ μλμμ μ‘°κΈ λ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€.
π HashMap νλ 1. μμ
HashMap ν΄λμ€μλ μ μ¬μ§μ²λΌ μ¬λ¬ νλλ€μ΄ μ‘΄μ¬νλλ°μ, κ° νλμ λν μ€λͺ μ λ€μκ³Ό κ°μ΅λλ€.
- DEFAULT_INITIAL_CAPACITY: Mapμ κΈ°λ³Έ μ΄κΈ° μ©λ(=λ²ν· μ)μΌλ‘ λν΄νΈ κ°μ 16
- MAXIMUM_CAPACITY: μ΅λ μ©λμΌλ‘ ν΄λΉ κ°μ μ΄κ³Όν μ μμ΅λλ€. κ°μ 2^30μΌλ‘ 1,073,741,824
- DEFAULT_LOAD_FACTOR: Mapμ μ©λμ λλ €μΌ νλ μκΈ°λ₯Ό κ²°μ νλ μ§νλ‘ κΈ°λ³Έ κ°μ 0.75(75%)
- μλ₯Ό λ€μ΄ HashMapμ μ¬μ΄μ¦κ° 16μ΄κ³ Load Factorμ 0.75μΌ κ²½μ° μ 체 μ¬μ΄μ¦ 16μμ 75%μ ν΄λΉνλ 12 ν¬κΈ°μ μ μ₯μκ° μ΄λ―Έ μ¬μ©μ€μ΄λΌλ©΄, μ μ₯μμ ν¬κΈ°λ₯Ό resizingν μκΈ°λΌκ³ νλ¨ν©λλ€.
- μΆν μ€λͺ λλ¦¬κ² μ§λ§, resizing μ μ μ₯μ ν¬κΈ°λ 2λ°°λ‘ μ¦κ°ν©λλ€.
- ~_THRESHOLD: THRESHOLDλ μκ³κ°μ λνλ΄λ μ©μ΄λ‘ νΈλ¦¬λ₯Ό μ¬μ©νκ±°λ/μ¬μ©νμ§ μκ±°λ νκΈ° μν μκ³κ°μ λνλΈλ€κ³ μ£Όμμ μ€λͺ μ΄ λμ΄ μμ΅λλ€. λ²ν·μ κ°―μκ° μΌμ μμ€μ λμ΄κ°λ©΄ λ²ν· κ΄λ¦¬λ₯Ό Tree νμμΌλ‘, κ·Έλ μ§ μλ€λ©΄ LinkedList(Node) ννλ‘ κ΄λ¦¬νλκ²μ λ°λΌ κ°μ μλ―Ένλ κ² κ°μ΅λλ€. (μ ννκ²λ μ΄ν΄νμ§ λͺ»ν΄ ν릴 μ μμ΅λλ€..π¦)
μ§λ Listμ ArrayListμ²λΌ HashMapλ μ΄κΈ° μ©λμ μ μ ν μ€μ νμ¬ κ°μ²΄λ₯Ό μμ±νλ κ²μ΄ ν¨μ¨μ μ λλ€.
(Listμ κ²½μ° Arrays.copyOf() λ©μλλ₯Ό μ¬μ©νμ¬ μλ‘μ΄ λ°°μ΄μ μμ±νλ μμ μ μ§ννκΈ° λλ¬Έμ λλ€.)
- Mapμ κ²½μ° κ° μμλ₯Ό bucketμ΄λΌκ³ νλ 곡κ°μ μ μ₯μ νλλ° μ΄κΈ° μ©λμ μ€μ νμ§ μμ 16μΈ κ²½μ° λΆνμ¨(Load Factor) λλΉ κ³΅κ°μ΄ κ°λ μ°¨λ©΄ resizingνλ μμ μ΄ μνλλ©° μ΄ λ λͺ¨λ μμλ€μ λν΄ ν΄μκ°μ ν΅ν΄ μ΄λ ν bucketμ μ μ₯ν μ§ κ³μ°μ νλ κ³Όμ (rehasing)μ΄ μκΈ°λλ¬Έμ κ°μ²΄λ₯Ό μμ±ν λ μ μ ν μ©λμ μ€μ νλ κ²μ΄ μ’μ΅λλ€.
- λ°λλ‘ μ΄κΈ° μ©λμ λ무 ν¬κ² μ€μ νλ€λ©΄ μ¬μ©λμ§ μλ λΆνμν 곡κ°μ λλΉνκΈ°μ μ μ ν κ° μ€μ μ΄ μ€μν κ² κ°μ΅λλ€.
π HashMap νλ 2. λ³μ
HashMapμ key-value μμλ μ μ¬μ§μ²λΌ Node<K,V>[] table λ³μμμ κ΄λ¦¬κ° λ©λλ€.
thresholdμ κ²½μ° Mapμ ν¬κΈ° μ‘°μ μ΄ νμν λ λ€μ ν¬κΈ° κ°(μ©λ * λΆνμ¨)μ μλ―Έν©λλ€.
π HashMap μμ±μ
HashMapμ μμ±μλ μ μ¬μ§μ²λΌ μ΄ 4κ°κ° μ‘΄μ¬ν©λλ€.
int νμ μ μΈμλ HashMapμ μ΄κΈ° μ©λμ μλ―Ένλ©°, float νμ μΈμλ μμμ μ΄ν΄λ³΄μλ Load Factorμ λΆνμ¨μ μλ―Έν©λλ€.
λ§μ§λ§ Map νμ μΈμλ λμΌν 맀νμ νκ³ μλ Mapμ λ°μμ μμ±ν©λλ€.
μμ±μμλ μ ν¨μ± κ²μ¦μ ν΅ν΄ μ΄κΈ° μ©λ, loadFactor κ°μ μ€μ νλλ°μ μμμ tableSizeFor() λ©μλμ λν΄μλ§ μ΄ν΄λ³΄κ² μ΅λλ€.
μ΄κΈ° μ©λ(initialCapacity)λ₯Ό 10μΌλ‘ μ€μ νμ λ tableSizeFor λ©μλκ° λ¦¬ν΄νλ κ°μ 16μ λλ€.
λ°λΌμ, threshold κ°μ 16μ΄ λ©λλ€.
(μλ μ£Όμμ²λΌ 리ν΄νλ κ°μ νμ 2μ μ κ³±μ μ λλ€... 2-4-8-16-32-64 ...)
numberOfLeadingZeros() λ©μλμ λ‘μ§μ μλμ κ°μΌλ©° ν΄λΉ μ½λμ λν μ€λͺ μ stackoverflowλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ:
μ΄μμΌλ‘ HashMapμ κ°λ λ° κ° νλ μμ±μμ λν΄ μ΄ν΄λ³΄μμ΅λλ€.
λ΄μ©μ΄ λ무 κΈΈμ΄μ§κΈ°μ 2νΈμΌλ‘ λλμ΄ λ€μ μκ°μ HashMapμ λ€μν λ©μλμ 리μ¬μ΄μ§, ν΄μ λ±μ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
π μ°Έκ³ μλ£
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Java Map - compute(), computeIfAbsent(), computeIfPresent() (0) | 2023.03.13 |
---|---|
EasyRandom - Java beansλ₯Ό λλ€μΌλ‘ μμ±ν΄ μ£Όλ λΌμ΄λΈλ¬λ¦¬ (0) | 2023.01.27 |
[Java DeepDive] - List (ArrayList) (2) | 2022.10.29 |
[Java DeepDive] - String (2) λ΄μ₯ ν¨μ (0) | 2022.10.23 |
[Java DeepDive] - String (1) λ¬Έμμ΄ μμ± (0) | 2022.10.10 |
λκΈ