在字符串的情况下,Kotlin 中的引用与结构相等

Referential vs Structural equality in Kotlin in case of strings

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

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

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

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

但是当参照性地比较具有相同内容的两个字符串时,我得到了 true。

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?它们的核心是两种不同类型的对象。

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

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

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

对于 Val vs Var,下面 的回答解释了逻辑。

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