You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:09:03