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

时间:2018-12-29 12:53:49

标签: kotlin equality

这种行为是什么意思?

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

因为

  

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

     

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

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

3 个答案:

答案 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)

返回假

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

答案 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)