kotlin - 引用和值(value)比较

标签 kotlin

实际上,我是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")
}

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

最佳答案

Reference equality

Referential equality is checked by the === operation (and its negated counterpart !==). a === b evaluates to true if and only if a and b point to the same object.


换句话说,===运算符比较ab是否是相同的引用。在某些基本类型上进行测试可能会导致误导,原因是:
  • string interning
  • integer caching

  • 一个例子是:
    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为true。
    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
    
    Structural equality

    Structural equality is checked by the == operation (and its negated counterpart !=). By convention, an expression like a == b is translated to:

    a?.equals(b) ?: (b === null)


    正如我们在上面看到的,对于StringInt这样的内置类,即使它们的内容相等,对于引用相等===返回false也是完全正常的。 Kotlin定义了一些类,这些类可以通过data classes轻松地与内容进行比较,如下所示:
    数据类地址(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
    

    关于kotlin - 引用和值(value)比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47989604/

    相关文章:

    android - 无法从我的 fragment 中的 ViewModel 观察 LiveData<MutableList<T>>

    java - 是否可以在 Android Room 中使用 String 作为 PrimaryKey

    gradle - 为什么 kotlin gradle 插件无法使用 1.8 目标构建?

    kotlin - 在 kotlin 公开模型中,排序如何与限制一起工作?

    android - 如何在 Android 自定义数据绑定(bind)中传递带参数的函数

    kotlin - 计算所有列表元素的总和,直到满足条件

    android - 实现共享位置地点选择器,与没有地点选择器的 WhatsApp 相同,因为它已被弃用

    java - Android - 未经系统许可杀死另一个应用程序

    Android DataBinding 在点击时更改其他 View 的字体

    android - 在 Fragment 中选择微调器项目时复选框消失