【问题标题】:Referential vs Structural equality in Kotlin in case of strings在字符串的情况下,Kotlin 中的引用与结构相等
【发布时间】:2021-10-17 15:34:15
【问题描述】:

我目前对结构相等的理解是比较类型和内容。

对于引用相等,它比较两个对象的地址。另外,对于var的原始类型,如果内容相同,则打印为true。

根据doc here --> 数字、字符和布尔值可以在运行时表示为原始值——但对用户来说,它们看起来像普通的类。

所以 String 在运行时应该被视为对象。

但是当引用比较两个具有相同内容的字符串时,我得到了正确的结果。

fun main(){
    val name1 = "123"
    val name2 = "123"

    println(name1 == name2) //true, structural equality which is same type and same content (same as equals)

    // checks if left and right are same object --> referential equality
    println(name1 === name2) //true ????????
    // should print false. String is basic type and not primitve
    
    var Arr: IntArray = intArrayOf(1,2,3)
    var Arr2: IntArray = intArrayOf(1,2,3)
    println(Arr === Arr2) // prints false, arrays are basic type
}

另外,为什么两种类型的 kotlin 中的相等性不区分 val 和 var?它们的核心是两种不同类型的对象。

有人能指出我在哪里出错了吗?我可能在这里遗漏了一些非常明显的东西。

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/9698260/…
  • @gpunto 谢谢。它确实回答了我问题的第一部分。我将在答案中添加这个。
  • 我真的不明白为什么 valvar 应该被认为是不同的。这就像问如果属性/字段和局部变量本质上是不同的东西,为什么允许this.myProperty == localVariable。检查相等性时,数据存储在何处如何存储都无关紧要。我们正在检查 什么 被存储,我们正在寻找内容。

标签: kotlin string-comparison equality


【解决方案1】:

valvar 不是不同类型的对象。它们是引用,根本不是对象。它们与它们所指的对象的行为无关。当您比较两个对象时,引用它们的变量和属性的类型无论如何都不是一个因素。当您在一个对象上调用 equals 时,运行时仅使用引用来查找内存中的对象。只有这样才会调用它的函数。

【讨论】:

    【解决方案2】:

    所以就字符串比较而言,我认为它与 java 的作用相同,因为它将所有内容都添加到字符串常量池中。

    这是java中引用字符串比较的线程(由==完成) - What makes reference comparison (==) work for some strings in Java?

    对于 Val 与 Var,下面@Tenfour04 的答案解释了逻辑。

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多