var str:String是可变的还是不可变的?

RBK*_*RBK 13 string android immutability kotlin

我在Kotlin中声明了一个String变量.

var str: String

Kotlin文件与可变性概念相矛盾.根据文件... var是可变的. var是可变的

但对于String,它定义为不可变的. 字符串是不可变的

所以请澄清矛盾......

Fra*_*son 8

我不喜欢写文档的方式,但实际上并没有矛盾.他们使用" mutable"这个词,其方式是邀请程序符号对象之间的比较,这些对象并不是很有帮助.

var关键字声明的变量是可重新分配的,而使用关键字声明的变量val不是.

字符串是一种不可变的对象类型,一旦创建就无法更改.

变量是否可重新分配以及它指向的对象是否是不可变的是两个不同的东西.

这是一个例子:

class Person(var name: String)

val fred = Person("Fred")

fred.name = "Barry" // fred is not immutable

fred = Person("Barry") // ERROR Val cannot be reassigned
Run Code Online (Sandbox Code Playgroud)

因此,在文档的方式中使用mutable,只是因为符号被声明为a val不会使它指向不可变的对象.


Vis*_*tel 6

实际上,String variable是可变的,但String Value是不可变的.

感谢@ cricket_007

让我深入描述当你声明变量时发生的事情.

val string1 = "abcd"  
val string2 = "abcd"
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如上图所示和宣言.

-String池是堆内存中的特殊存储区域.

- 当a string is created和if中的字符串already exists在池中时,引用existing string will be returned,而不是创建新对象并返回其引用.

- 如果字符串不是不可变的,用一个引用更改字符串将导致其他引用的值错误.

现在我们可以使用此变量,现在我们的示例Value Assign to Variable String1.

我们也可以改变价值

string1.renameTo("Hi This Is Test")
Run Code Online (Sandbox Code Playgroud)

那么内存背后会发生什么?
- >是的,
如果 "Hi This Is Test"这个字符串可用,它将返回对" string1 " 的引用,
否则它创建新空间并给出引用" string1 "

实际上,这就是为什么String称为不可变的.

参考 - 链接