这种行为是什么意思?
var string1 = "hello"
var string2 = "hello"
println(string1 == string2) // return true
println(string1 === string2) // return true
因为
平等:确定两个对象是否包含相同的状态。 (==)
身份:确定两个对象是否共享相同的内存地址。 (===)
它们共享相同的内存地址吗?
答案 0 :(得分:0)
简短的回答是是,它们共享相同的内存地址。
下一个说明适用于 Kotlin / JVM 。声明新字符串时,幕后会发生一些有趣的事情。这是一个基本的字符串声明。我们创建一个名为string1
的新字符串变量,并为其提供一个值:
var string1 = "hello"
它将在内存中为文字值 hello 分配空间。内存中的该区域称为字符串常量池。这就像一个字符串值池,可供程序的其他部分使用。
现在,如果您创建了另一个变量,请说string2
,并且ALSO为其赋予了 hello 值。Kotlin将重新使用池中已有的值。
字符串常量池位于内存的一部分内,称为 heap 。这是内存的一部分,用于运行时操作,用于处理类和对象。将堆想象成一片花园土壤,您可以在种植花园时轻松地将泥土和植物从中取出。 Kotlin将这些新对象放置在那里。如果再创建一百个对象,那么Kotlin将在堆顶上再创建一百个文字。
我只会使用引用相等(===)来检查变量是否指向同一对象。
答案 1 :(得分:0)
是的,它们共享相同的内存地址。如果我们已经有了“ hello”,则不会通过
创建新的“ hello”var string2 = "hello"
如果您是根据构造函数创建的新字符串
var string2 = String("hello")
然后
println(string1 === string2)
返回假
答案 2 :(得分:0)
我为您的好问题做了一些发现。
与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)