默认情况下对象是否共享相同的内存地址

Do objects share the same memory address by default

这种行为是什么意思?

var string1 = "hello"
var string2 = "hello"
println(string1 == string2) // return true
println(string1 === string2) // return true

因为

equality: determines if two objects contain the same state. (==)

identity: determines whether two objects share the same memory address. (===)

它们共享相同的内存地址吗?

简短的回答是,它们共享相同的内存地址。

接下来的描述适用于 Kotlin/JVM。当您声明一个新字符串时,幕后会发生一些有趣的事情。这是一个基本的字符串声明。我们创建一个名为 string1 的新字符串变量并为其赋值:

var string1 = "hello"

它将在内存中分配 space 用于文字值 hello。内存中的这个区域称为字符串常量池。它就像一个可供程序其他部分使用的字符串值池。 现在,如果您创建了另一个变量,比如说 string2,并且还给它一个值 hello,Kotlin 会重新使用池中已有的值。 字符串常量池位于称为 heap 的一段内存中。这是用于 运行 时间操作的内存的一部分,与 类 和对象一起工作。把一堆想象成一块花园土壤,当你种植花园时,你可以很容易地从中取出泥土和植物。 Kotlin 将这些新对象放在那里。如果您再创建一百个对象,Kotlin 将在堆顶上再创建一百个文字。

我会使用引用相等性 (===) 只是为了检查变量是否指向同一个对象。

是的,它们共享相同的内存地址。如果我们已经有 "hello",新的 "hello" 将不会由

创建
var string2 = "hello"

如果您通过构造函数创建了新字符串

var string2 = String("hello")

然后

println(string1 === string2)

return 假

了解 Java 字符串池 https://www.baeldung.com/java-string-pool

我对你的好问题做了一些调查。

Kotlin's Reference 中一样,原始类型在 ===== 中的处理方式相同。

但对于自定义对象,它们的工作方式不同。 == 比较结构,=== 检查引用。

    fun main(args: Array<String>) {
    val v1 = Temp("world")
    val v2 = Temp("world")

    println(v1 == v2)// true
    println(v1 === v2)// false
    }


    data class Temp(var val1: String)