kotlin - 默认情况下对象是否共享相同的内存地址
问题描述
这种行为是什么意思?
var string1 = "hello"
var string2 = "hello"
println(string1 == string2) // return true
println(string1 === string2) // return true
自从
相等:确定两个对象是否包含相同的状态。(==)
identity:确定两个对象是否共享相同的内存地址。(===)
它们共享相同的内存地址吗?
解决方案
简短的回答是YES,它们共享相同的内存地址。
下一个描述适用于Kotlin/JVM。当您声明一个新字符串时,幕后会发生一些有趣的事情。这是一个基本的字符串声明。我们创建一个名为的新字符串变量string1
并给它一个值:
var string1 = "hello"
它将在内存中为文字值hello分配空间。内存中的这个区域称为字符串常量池。它就像一个可供程序其他部分使用的字符串值池。现在,如果您创建了另一个变量,比如说string2
,并且还给它一个值hello Kotlin 会重新使用池中已经存在的值。字符串常量池位于内存的一部分称为堆. 这是用于运行时操作、处理类和对象的内存的一部分。将一堆想象成一块花园土壤,当您种植花园时,您可以轻松地从中取出泥土和植物。Kotlin 将这些新对象放在那里。如果您再创建一百个对象,Kotlin 将在堆顶上再创建一百个文字。
我只会使用参照相等(===)来检查变量是否指向同一个对象。