kotlin 参考和数值比较

sz81bmfz  于 2022-08-04  发布在  Kotlin
关注(0)|答案(3)|浏览(134)

事实上,我是新来的Kotlin;因此,这个问题可能是很基本的。
根据Kotlin文档,可以使用=====操作符比较两个变量。第一个(“==”)检查它们是否具有相同的内容,第二个(“+==”)检查它们是否具有相同的引用。但是,我找不到任何对象具有相同内容但具有不同引用的内置类。

var str1 : String = "Hello World"
var str2 : String = "Hello World"

if( str1 == str2 ){ // yes
   print("Their contents are same\n")
{

if( str1 === str2 ){ // yes
   print("Their references are same\n")
}

到目前为止我遇到的所有类的示例如果它们的内容相同,那么它们的引用也相同。我们如何定义两个内容相同但引用不同的对象呢?

tf7tbtn2

tf7tbtn21#

引用相等

引用相等性由===操作(及其求反的对应项!==)检查。当且仅当a和b指向同一对象时,a === b才计算为true。
换句话说,===运算符比较ab是否是相同的引用。在一些基本类型上使用它可能会引起误解,原因如下:

例如:

val a:Int? = 123
val b:Int? = 123
println(a === b) // => true

val c:Int? = 130
val d:Int? = 130
println(c === d) // => false

显然,在这两种情况下,a == bc == d都为真。
Since string interning is also possible at compile time===在简单场景中也返回true

val a = "ala"
val b = "ala"
println(a === b) // => true

val c = "!ala".substring(1)
val d = "!ala".substring(1)
println(c === d) // => false

结构相等

使用==运算符(及其求反的对应项!=)检查结构是否相等。按照约定,类似a == b的表达式将转换为:
a?.equals(b) ?: (b === null)
正如我们在上面看到的,对于StringInt这样的内置类来说,即使它们的内容是相等的,也会因为引用相等===而返回false,这是非常正常的。Kotlin允许我们定义这样的类,它们可以很容易地检查与data classes的结构相等性,如下所示:

data class Address(val city:String, val street1:String)

val a = Address("Warsaw", "Jagielońska")
val b = Address("Warsaw", "Jagielońska")

println(a === b) // => false
println(a == b) // => true
2eafrhcq

2eafrhcq2#

像这样比较String引用将返回true,因为JVM通过重用第一个String示例来优化示例代码,因为它无论如何都是不可变的。
然而,如果直接调用类的构造函数,则会跳过任何优化,并获得不同的示例:

val i1 = Integer(1)
val i2 = Integer(1)

println(i1 == i2)  // true
println(i1 === i2) // false

旁注:在Java中,我会用new String("Hello world")来展示这个例子,但显然KotlinString类没有这种形式的构造函数。

ie3xauqp

ie3xauqp3#

由于您定义字符串的方式,===不起作用。如果您使用文本创建字符串,它将指向字符串池中的同一个字符串。

var str1 = "Hello World"
    var str2 = "Hello World"
    val str3 = buildString { "Hello World" }
    val str4 = buildString { "Hello World" }

    var result = str1===str2 // true
    println(result)

    result = str1 == str2 // true
    println(result)

    result = str3 === str4 // false
    println(result)

    result = str3 == str4 // true
    println(result)

相关问题