在字符串的情况下,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,下面 的回答解释了逻辑。
val
和 var
不是不同类型的对象。它们是引用,根本不是对象。它们与所指对象的行为无关。当您比较两个对象时,引用它们的变量和属性的类型根本不是一个因素。当您对一个对象调用 equals 时,运行时仅使用引用在内存中查找该对象。才调用了它的函数。
我目前对结构相等的理解是比较类型和内容
对于引用相等,它比较两个对象的地址。另外,对于原始类型的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,下面
val
和 var
不是不同类型的对象。它们是引用,根本不是对象。它们与所指对象的行为无关。当您比较两个对象时,引用它们的变量和属性的类型根本不是一个因素。当您对一个对象调用 equals 时,运行时仅使用引用在内存中查找该对象。才调用了它的函数。