当引用不同时,为什么引用相等性检查返回true

pde*_*eva 5 kotlin

考虑以下代码:

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打印第二次检查,因为两个参考不同

Edw*_*ers 4

引用相等并不是变量名相同,或者访问方式相同,而是在内存中的位置相同。由于字符串是不可变的,因此编译器通常能够提前为它们保留内存,并使对相同值的所有引用都指向相同的位置。

不变性很重要,因为在读/写引用不同的情况下共享只读引用是安全的。如果您在可变数据结构之间不正确地共享引用,则一组引用的修改将反映在另一组引用中,从而导致奇怪且不正确的行为。但是,如果数据不再更改,您可以通过让所有内容都指向相同的数据来节省尽可能多的内存。