考虑以下代码:
fun main(args : Array<String>) {
println("Async" == MetricCategory.Async.toString())
println("Async" === MetricCategory.Async.toString())
}
Run Code Online (Sandbox Code Playgroud)
它输出
true
true
Run Code Online (Sandbox Code Playgroud)
虽然我在期待
true
false
Run Code Online (Sandbox Code Playgroud)
为什么true打印第二次检查,因为两个参考不同
引用相等并不是变量名相同,或者访问方式相同,而是在内存中的位置相同。由于字符串是不可变的,因此编译器通常能够提前为它们保留内存,并使对相同值的所有引用都指向相同的位置。
不变性很重要,因为在读/写引用不同的情况下共享只读引用是安全的。如果您在可变数据结构之间不正确地共享引用,则一组引用的修改将反映在另一组引用中,从而导致奇怪且不正确的行为。但是,如果数据不再更改,您可以通过让所有内容都指向相同的数据来节省尽可能多的内存。