什么操作员'==='在Kotlin做什么?它是如何工作的?我们可以检查参考相等吗?
val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
但是以防:
var a : Int = 1000
var b : Int = 1000
println(a === b) // print 'true' !!!
val a: Int = 1000
和val b: Int = 1000
不在范围-128..127
中,但仍然===
为真,或者编译器在某些情况下理解它可以取一个值?
答案 0 :(得分:34)
作为documented,它代表参考平等:
参数相等性由===操作(及其否定对应物!==)检查。当且仅当a和b指向同一个对象时,a === b的计算结果为真。
引用相等意味着两个引用指向同一个对象。每个实例:
fun main(args: Array<String>) {
val number1 = Integer(10) // create new instance
val number2 = Integer(10) // create new instance
val number3 = number1
// check if number1 and number2 are Structural equality
println(number1 == number2) // prints true
// check if number1 and number2 points to the same object
// in other words, checks for Referential equality
println(number1 === number2) // prints false
// check if number1 and number3 points to the same object
println(number1 === number3) // prints true
}
将其与下面的Java代码进行比较:
public static void main(String[] args) {
Integer number1 = new Integer(10); // create new instance
Integer number2 = new Integer(10); // create new instance
Integer number3 = number1;
// check if number1 and number2 are Structural equality
System.out.println(number1.equals(number2)); // prints true
// check if number1 and number2 points to the same object
// in other words, checks for Referential equality
System.out.println(number1 == number2); // prints false
// check if number1 and number3 points to the same object
System.out.println(number1 == number3); // prints true
}
此外,作为documented here,“数字装箱不会保留身份”。因此,boxedA
将拥有一个身份,但anotherBoxedA
将拥有另一个身份。两者都具有结构平等,但没有参考平等。
但为什么第二个有效呢?因为Kotlin Int
类型对应于Java int
类型。在第二个示例中比较的两个变量是基本类型值,而不是对象。因此,对于他们来说,引用相等与正则相等完全相同。