我目前对结构相等性的理解是比较类型和内容
For参照相等,它比较两个对象的地址。同样,对于原语类型对于var,如果内容相同,它将输出true。
根据这里的文档——>数字、字符和布尔值可以在运行时表示为原始值,但对用户来说,它们看起来就像普通的类。
所以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
var name3 = "123"
println(name1 === name3) //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中用于引用字符串比较的线程(由==完成)-是什么使得引用比较(==)在Java中的一些字符串工作?
对于Val和Var,下面@Tenfour04的答案解释了逻辑。
val
和var
不是不同类型的对象。它们是引用,而不是对象。它们与它们所指向的对象的行为无关。当比较两个对象时,引用它们的变量和属性的类型并不是一个因素。当在一个对象上调用等号时,运行时仅使用引用在内存中查找该对象。只有这样才能调用它的函数。