Immutability and Collections
Array objects that we create with arrayOf() are mutable. Not only can we use [] syntax to retrieve a value based on its index, but we can use []= syntax to replace a value based on its index:
val thingsArray = arrayOf("foo", "bar", "goo")
thingsArray[1] = "something completely different"
println(thingsArray[1])
However, this fails if you try it with a List created using listOf():
val thingsList = listOf("foo", "bar", "goo")
thingsList[1] = "something completely different"
println(thingsList[1])
You get some very strange syntax error messages:
e: klassbook.kt: (4, 1): Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@InlineOnly public inline operator fun MutableMap.set(key: Int, value: String): Unit defined in kotlin.collections
e: klassbook.kt: (4, 11): No set method providing array access
The error is raised because listOf() returns a List, which does not have support for the []= operator. A List is immutable: you cannot replace its members with other objects.
If you need a list where you can replace its members, you can use mutableListOf():
val thingsList = mutableListOf("foo", "bar", "goo")
thingsList[1] = "something completely different"
println(thingsList[1])
Here, thingsList is actually a MutableList, which is a sub-type of List that supports []=.
The same distinction holds true for Map. A Map is immutable, but a MutableMap created via mutableMapOf() can be modified.
We will explore more about Kotlin’s philosophy towards immutability in a later chapter. In general, aim to use immutable lists and maps, unless you have a very specific reason to do otherwise.
Prev Table of Contents Next
This book is licensed under the Creative Commons Attribution-ShareAlike 4.0 International license.