首页 > 解决方案 > 默认情况下对象是否共享相同的内存地址

问题描述

这种行为是什么意思?

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

自从

相等:确定两个对象是否包含相同的状态。(==)

identity:确定两个对象是否共享相同的内存地址。(===)

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

标签: kotlinobjectmemoryshared-memoryequality

解决方案


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

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

var string1 = "hello"

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

我只会使用参照相等(===)来检查变量是否指向同一个对象。


推荐阅读