Kotlin 参考和价值比较

Kotlin 参考和价值比较,kotlin,Kotlin,事实上,我是科特林的新手;因此,这个问题可能是非常基本的 根据kotlin文档,两个变量可以与===和==运算符进行比较。 第一个“==”检查它们是否具有相同的内容,第二个“+==”检查它们是否具有相同的引用。 但是,我找不到任何对象具有相同内容但引用不同的内置类 var str1 : String = "Hello World" var str2 : String = "Hello World" if( str1 == str2 ){ // yes print("Their conte

事实上,我是科特林的新手;因此,这个问题可能是非常基本的

根据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")
}

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

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

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)

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

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)
引用相等性由===操作及其否定的对应项检查!==。当且仅当a和b指向同一对象时,a===b计算为真

换句话说,如果a和b是相同的引用,则===运算符将进行比较。在某些基本类型上进行测试可能会导致遗漏,因为:

例如:

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==b和c==d都是真的

===在简单场景中也返回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?.equalsb?:b==null

正如我们在上面看到的,对于诸如String和Int之类的内置类来说,返回false表示引用相等===是完全正常的,即使它们的内容相等。Kotlin定义的类很容易通过内容与数据类进行比较,如下所示:

数据类地址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
引用相等性由===操作及其否定的对应项检查!==。当且仅当a和b指向同一对象时,a===b计算为真

换句话说,如果a和b是相同的引用,则===运算符将进行比较。在某些基本类型上进行测试可能会导致遗漏,因为:

例如:

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==b和c==d都是真的

===在简单场景中也返回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?.equalsb?:b==null

正如我们在上面看到的,对于诸如String和Int之类的内置类来说,返回false表示引用相等===是完全正常的,即使它们的内容相等。Kotlin定义的类很容易通过内容与数据类进行比较,如下所示:

数据类地址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
比较这样的字符串引用将返回true,因为JVM通过重用第一个字符串实例来优化示例代码,因为它无论如何都是不可变的。例如,请参阅关于此的更多讨论

但是,如果直接调用类的构造函数,将跳过任何优化,并获得不同的实例:

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

println(i1 == i2)  // true
println(i1 === i2) // false
旁注:在Java中,我会用新的StringHello world展示这个示例,但显然Kotlin String类没有这种形式的构造函数。奇怪。

比较这样的字符串引用将返回true,因为JVM通过重用第一个字符串实例来优化示例代码,因为它无论如何都是不可变的。例如,请参阅关于此的更多讨论

但是,如果直接调用类的构造函数,将跳过任何优化,并获得不同的实例:

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

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

旁注:在Java中,我会用新的StringHello world展示这个示例,但显然Kotlin String类没有这种形式的构造函数。奇怪。

第二个案例将比较相同的类型。第二个案例将比较相同的类型。