首页 文章

有趣的运营商'==='在Kotlin

提问于
浏览
20

什么操作员'==='在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 = 1000val b: Int = 1000 不在 -128..127 范围内,但仍然 === 为真或编译器在某些情况下理解它可以取一个值?

1 回答

  • 34

    documented,它代表 Referential Equality

    参数相等性由===操作(及其否定的对应物!==)检查 . 当且仅当a和b指向同一个对象时,a === b的计算结果为true .

    引用相等意味着两个引用指向同一个对象 . 每个实例:

    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,"boxing of numbers does not preserve identity" . 所以, boxedA 将有一个身份,但 anotherBoxedA 将有另一个身份 . 两者都有结构平等,但没有参照平等 .

    但为什么第二个有效?因为Kotlin Int 类型对应于Java int 类型 . 在第二个示例中比较的两个变量是基本类型值,而不是对象 . 因此,对于它们,引用相等与正则相等完全相同 .

相关问题