#본 포스팅은 Kotlin 기준으로 작성되었습니다.
linkedMapOf는 LinkedHashMap을 반환하겠지.
hashMapOf는 HashMap을 반환하겠지.
mutableMapOf는 MutableMap을 반환하겠지. 근데 그건 사실 LinkedHashMap이였다.
왜?
mutableMapOf
mutableMapOf 함수는 LinkedHashMap을 반환하는 함수이다.
public inline fun <K, V> mutableMapOf(): MutableMap<K, V> = LinkedHashMap()
public fun <K, V> mutableMapOf(vararg pairs: Pair<K, V>): MutableMap<K, V> =
LinkedHashMap<K, V>(mapCapacity(pairs.size)).apply { putAll(pairs) }
초기값이 없는 경우에는 inline 함수가 호출되어 런타임에서의 오버헤드가 없다는 장점이 있다.
LinkedHashMap은 HashMap보다는 느리지만 데이터 삽입 순서를 보장하는 HashMap이기 때문에 특수한 상황에서 유용하게 사용될 수 있다.
근데 사실 HashMap보다 느리다는 것도 일반적인 경우에는 성능에 거의 차이가 없다시피 할 정도이기 때문에 둘 중 뭘 사용해도 무방하나, 삽입 순서가 중요하지 않은 데이터에 대해서는 가급적 hashMapOf를 사용하는 것을 추천한다.
linkedMapOf
linkedMapOf는 LinkedHashMap을 반환하는 함수이다.
public inline fun <K, V> linkedMapOf(): LinkedHashMap<K, V> = LinkedHashMap<K, V>()
public fun <K, V> linkedMapOf(vararg pairs: Pair<K, V>): LinkedHashMap<K, V> =
pairs.toMap(LinkedHashMap(mapCapacity(pairs.size)))
두 함수의 차이점은
linkedMapOf 함수는 LinkedHashMap 인스턴스를 반환한다. 명시적인 구현체 지정을 통해 순서가 유지되는 맵이 필요한 경우에 사용한다.
mutableMapOf 함수는 MutableMap 인터페이스를 반환한다는 점이다. 내부적으로 어떤 구현체가 사용되는지는 신경쓰지 않고, 수정 가능한 맵이라는 것에 중점을 둔다.
// LinkedHashMap
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
// MutableMap
public interface MutableMap<K, V> : Map<K, V>
따라서 LinkedHashMap의 함수를 사용하기 위해서는 linkedMapOf 함수를,
그렇지 않은 경우에는 mutableMapOf 함수를 사용하면 된다.
hashMapOf
hashMapOf는 HashMap을 반환하는 함수이다.
public inline fun <K, V> hashMapOf(): HashMap<K, V> = HashMap<K, V>()
HashMap는 HashCode를 사용하여 데이터를 저장 및 탐색하는 Map이다.
조만간 해시 충돌 deepdive를 해볼 생각이다. HashMap 내부 플로우를 어느 정도는 알고 있지만, 자세히 어떤 일이 어떻게 일어나는지 궁금하다.
'CS' 카테고리의 다른 글
[CS] Java 1.8과 Java 8의 차이 (0) | 2023.07.12 |
---|---|
GPL과 DSL의 차이 (0) | 2023.06.28 |
[CS] 동시성과 병렬성의 차이 (0) | 2023.04.17 |
Json이 독립적인 데이터 포맷인 이유 (0) | 2023.01.02 |