Val states that the reference is immutable, the value can not be reasigned:
val a : String = "hi"
a = "b" //not valid because a is reassigned
The variable which is referenced can change, depending on its implementation:
val a = mutableListOf<String>() //can change
val b = listOf<String>() //cannot change
The implementation of String is that it can't change, so String itself is immutable.