Kotlin中String是否为不可变类型?修改var修饰字符串变量为何可行
Kotlin中字符串不可变的真实含义
你混淆了两个独立的可变性概念:变量引用的可变性 和 对象本身的可变性。
1. val/var修饰的是变量引用,和对象本身无关
val表示变量的引用不可变:一旦给val变量赋值了某个对象的引用,你就不能再让这个变量指向其他对象,该规则对所有类型的变量都生效。var表示变量的引用可变:你可以随时让var变量指向另一个同类型的对象,同样对所有类型生效。
2. 字符串不可变指的是String对象本身的内容不可修改
Kotlin的String类内部存储的字符序列一旦创建完成,就没有任何方法可以修改它内部的内容,所有对String的操作(比如uppercase()、replace()、拼接等)都会返回一个全新的String对象,原对象的内容永远不会发生变化。
举个你提到的var场景为例:
fun main() { var str = "abcd" str = "efgh" // 这里并没有修改原来"abcd"对象的内容,只是让str这个变量指向了新创建的"efgh"对象 // 原先的"abcd"对象依然存在于内存中,内容没有任何改变 }
你可以和可变类型做对比更易理解,比如MutableList:
fun main() { // 用val声明变量,引用不可变,永远指向同一个MutableList对象 val list = mutableListOf(1,2,3) list.add(4) // 合法,因为MutableList本身是可变对象,可以修改内部内容 println(list) // 输出[1,2,3,4],对象本身的内容被修改了 }
而String永远不可能有类似上面add()这种修改自身内容的方法,所有操作都只会生成新对象。
官方文档的表述里的“初始化后值不可修改”,特指String实例本身的内容不可修改,而非禁止用var变量重新指向新的String对象。
内容的提问来源于stack exchange,提问作者Mohammad Derakhshan
相关产品推荐
相关产品推荐

