string - 在 kotlin 中字符串是不可变的
问题描述
我正在尝试通过阅读 Kotlin 的文档来学习它。在文档中有一个关于字符串的部分。在该部分中它说:
字符串是不可变的。初始化字符串后,您将无法更改其值或为其分配新值。所有转换字符串的操作都在一个新的 String 对象中返回它们的结果,而原始字符串保持不变。
并试图用一个例子来证明这一点:
fun main() {
val str = "abcd"
println(str.uppercase()) // Create and print a new String object
println(str) // the original string remains the same
}
我对上面写着的部分有疑问:
初始化后字符串的值不能改变。
但是当我更改为时val
,var
我可以轻松更改字符串的值。
那么文档中说字符串的值不能改变是什么意思呢?我们知道这val
使得变量不可变,而不仅仅是字符串。
解决方案
但是当我更改为时
val
,var
我可以轻松更改字符串的值。
不,你不能轻易做到这一点。假设你有:
var str = "foo"
这不会改变字符串的值"foo"
:
str = "bar"
您只是获取另一个实例String
并将其放入 propertystr
中。
请注意,“字符串”和“属性”之间存在差异。“字符串”是指String
您通过执行创建的类的实例"foo"
。该实例是不可变的。你不能对它做任何事情来使同一个实例具有与 f、o、o 不同的字符序列。这是因为String
该类没有提供执行此操作的公共成员,这就是文档说“String
不可变”时所指的内容。
另一方面,“属性”是str
你声明的那个var str = ...
,它是可变的。它存储String
s 的实例,您可以更改它存储的实例。但是一旦创建了字符串,您就不能更改它们本身。
将此与列表进行比较。List
是不可变的,但你仍然可以这样做:
var myList: List<Int> = listOf(1, 2, 3)
现在假设您要删除列表中的所有 3。您必须创建一个新列表:
// "filter" creates a new list
myList = myList.filter { it != 3 }
因为List
是不可变的,并且它没有任何方法可以在不创建新列表的情况下执行此操作。但是,如果myList
是 a MutableList
,您可以这样做:
// this does not create a new list
myList.removeIf { it == 3 }
虽然没有MutableString
:)
推荐阅读
- javascript - 加载页面后如何添加元标记?
- webpack - 为什么 ttf 字体不能与 Vue CLI 一起使用?
- javascript - 为什么物化 css 和 *ngFor 的轮播不能动态协同工作以获取图像
- android - 如何将存储库注入 ViewModel?
- python-3.x - 使用 matplotlib 和 opencv 在 Python 中存储和检索图像
- c - 仅在控制台的左侧和右侧设置文本
- python - 'range' 对象不支持项赋值 int 赋值给数组
- python - Tkinter:动态添加下拉菜单并获取它们的值
- selenium - 为什么这段代码不会触发鼠标事件?
- google-apps-script - 如何根据当前选定的单元格隐藏行?