Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin: val mutableList vs var immutableList. When to use which?

We are encouraged to have immutable variables as much as we can.

But sometimes when I have to modify a list I start to wonder which approach would be better for current situation...

val mutableList = mutableListOf()
// where I can just .add() / .remove() accordingly

or

var immutableList = listOf()
// where I can create a new list (using filter or `+`) each time a change is made

I guess there are different scenarios one is preferred over the other. Hence I would like to know when one should be used over the other

like image 274
Elye Avatar asked Aug 07 '18 03:08

Elye


People also ask

What is difference between mutable and immutable in Kotlin?

Mutable – The contents of the list can be freely changed. Read-Only – The contents of the collection are not meant to be changed. However, the underlying data can be changed. Immutable – Nothing can change the contents of the collection.

What is difference between list and MutableList in Kotlin?

A quick glance at Kotlin's documentation provides a good overview about what the difference between them is: while List provides read-only access to stored elements, MutableList provides “list-specific write operations” that allow us to add or remove particular elements from an existing list.

What is mutable and immutable list in Kotlin?

Kotlin has two types of lists, immutable lists (cannot be modified) and mutable lists (can be modified). Read-only lists are created with listOf() whose elements can not be modified and mutable lists created with mutableListOf() method where we alter or modify the elements of the list.

How do you declare a MutableList in Kotlin?

Kotlin MutableList Example 2 MutableList can also be declared as empty and added elements later but in this situation we need to define its generic type. For example: fun main(args: Array<String>){ var mutableList1 = mutableListOf("Ajay","Vijay")


1 Answers

val -> You could think that you can't reassign for the variable.

//that is ok
var a:Int = 1
a=2
//Even you can reassign but you can't change its type
a= "string"  //that's wrong

//that is wrong
val b:Int = 1
b = 2

ListOf -> You could think that you can't insert/delete/alter any element in the list (can't do anything to the content of the list)

var list:List<Int> = listOf(1,2,3,4) //[1,2,3,4]
//you can read list
list.get(0)
list[0]
//but you can't change(/write) the content of the list (insert/delete/alter)
list.set(0, 100)
list.add(5)
list.removeAt(0)

var mutableList:MutableList<Int> = mutableListOf(1,2,3,4) //[1,2,3,4]
//you can read and write
mutableList.get(0)
mutableList.set(0, 100) //[100,2,3,4]
mutableList.add(5)      //[100,2,3,4,5]
mutableList.removeAt(0) //[2,3,4,5]

SO combine both of them, you will get four cases

Case 1: var mutableList:MutableList = mutableListOf(1,2,3,4)

//you can reassign 
mutableList = mutableListOf(4,5,6,7) //[4,5,6,7]
//you can alter the content 
mutableList.set(0, 100) //[100,5,6,7]
mutableList.add(8)      //[100,5,6,7,8]
mutableList.removeAt(0) //[5,6,7,8]

Case 2: val mutableList:MutableList = mutableListOf(1,2,3,4)

//you can't reassign 
mutableList = mutableListOf(4,5,6,7) //that's wrong

//you can alter the content 
mutableList.set(0, 100) //[100,2,3,4]
mutableList.add(8)      //[100,2,3,4,8]
mutableList.removeAt(0) //[2,3,4,8]

Case 3: var list:List = ListOf(1,2,3,4)

//you can reassign 
list= ListOf(4,5,6,7) //[4,5,6,7]

//you can't alter the content 
list.set(0, 100) //that's wrong
list.add(8)      //that's wrong
list.removeAt(0) //that's wrong

Case 4: val list:List = ListOf(1,2,3,4)

//you can't reassign 
list= ListOf(4,5,6,7) //that's wrong

//you can't alter the content 
list.set(0, 100) //that's wrong
list.add(8)      //that's wrong
list.removeAt(0) //that's wrong

//the only thing you can do is Read
list.get(0)  //return 1
list[0]      //return 1
like image 183
Leon Chang Avatar answered Oct 04 '22 20:10

Leon Chang