默认情况下对象是否共享相同的内存地址
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)
这种行为是什么意思?
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)