code 1

  • fun main(args: Array<String>) {
    val a : Int = 1000
    println(a == a) //true
    println(a === a) //true
    val a1 : Int = a
    val a2 : Int = a
    println(a1 == a2) //true
    println(a1 === a2) //true
    }

code 2

fun main(args: Array<String>) {
val a : Int = 1000
println(a == a) //true
println(a === a) //true
val a1 : Int? = a
val a2 : Int? = a
println(a1 == a2) //true
println(a1 === a2) //false
}

这里先扔出结论:在Kotlin中,=== 表示比较对象地址,== 表示比较两个值大小。

所以无论是 a == a 还是 a === a 都是返回true,因为是同一个变量,数值大小和地址都是相等的。

现在重点看 a1 和 a2,这里的把 a 分别赋给 a1 和 a2。
code 1 和 code 2 的不同点在于 a1 和 a2 的类型。一个是Int,一个是Int?。它们的区别如下:

如果我们使用的是 val a : Int = 999 这种方式,这时的a其实就是个数值, 不涉及装箱的问题, 也就不是对象。
而如果我们使用的是 val a: Int? = 999 这种方式,这时的a是一个Int型对象, 因为它涉及到装箱问题。
code 1 中 a1 和 a2 都没有装箱,所以不是对象,只是数值,所以数值大小和地址都是相等的。而 code 2 中 a1 和 a2 涉及到装箱,已经变成了对象,此时它们的数值仍然相等,但地址已经不同了(因为是不同对象)

code 3

fun main(args: Array<String>) {
val a : Int? = 1000
println(a == a) //true
println(a === a) //true
val a1 : Int? = a
val a2 : Int? = a
println(a1 == a2) //true
println(a1 === a2) //true
}

code 3 和 code 2 做比较,发现将a也装箱后,a1 === a2返回 true,这是为什么呢?

因为这里的a经过装箱后本身已经一个对象,所以赋给a1和a2的时候是把直接把对象a赋给它们,所以此时a1和a2指的是同一个对象(对象a)。既然是同一个对象,那么数值大小和地址肯定都是相等的了(也就是说a,a1和a2这三个对象指向同一处地址,所以其实 a === a1和a === a2也是返回true)。
code 4

fun main(args: Array<String>) {
val a : Int = 100
println(a == a) //true
println(a === a) //true
val a1 : Int? = a
val a2 : Int? = a
println(a1 == a2) //true
println(a1 === a2) //true
}

code 4 和 code 2 做比较,明明只是改了一下a的值,为什么就会产生不同的结果呢?

这里跟 Java 中是一样的,在范围是 [-128, 127] 之间的数装箱时并不会创建新的对象,所以这里a1和a2装箱后的对象是同一个,a1 === a2也就返回true了。这里改为128或-129就又会变成false了。

原文:https://blog.csdn.net/fzhhsa/article/details/83278321

kotlin中“==”和“===”的区别的更多相关文章

  1. Kotlin中?和!!的区别

    很多同学刚上手使用Kotlin知道它有针对Java NullPointerException的管理,而在Kotlin中?和!!均是和NullPointerException有关系,可他们的区别到底是什 ...

  2. Kotlin中的object 与companion object的区别

    之前写了一篇Kotlin中常量和静态方法的文章,最近有人提出一个问题,在companion object中调用外部的成员变量会调用不到,这才意识到问题,本篇文章会带着这个疑问来解决问题. 一. obj ...

  3. Kotlin中与Java不同的地方 需要注意

    1. 在Kotlin中不会将基本数据类型的自动转型比如 scriptIntrinsicBlur.setRadius(25) //报错, 必须写成 25f 或者 调用.toFloat() 2.Kotli ...

  4. Kotlin中常量和静态方法

    常量 Java中: class StaticDemoActivity { public static final String LOAN_TYPE = "loanType"; pu ...

  5. 浅谈Kotlin中的函数

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/UV23Uw_969oVhiOdo4ZKAw作者:连凌能 Kotlin,已经被Android官方 ...

  6. kotlin中的嵌套类与内部类

    Java中的内部类和静态内部类在Java中内部类简言之就是在一个类的内部定义的另一个类.当然在如果这个内部类被static修饰符修饰,那就是一个静态内部类.关于内部类 和静态内部类除了修饰符的区别之外 ...

  7. Kotlin中变量不同于Java: var 对val(KAD 02)

    原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ...

  8. MyBatis Mapper.xml文件中 $和#的区别

    MyBatis Mapper.xml文件中 $和#的区别   网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramN ...

  9. (实用篇)PHP中unset,array_splice删除数组中元素的区别

    php中删除数组元素是非常的简单的,但有时删除数组需要对索引进行一些排序要求我们会使用到相关的函数,这里我们来介绍使用unset,array_splice删除数组中的元素区别吧 如果要在某个数组中删除 ...

随机推荐

  1. vcftools报错:Writing PLINK PED and MAP files ... Error: Could not open temporary file.解决方案

    一般来说有两种解决方案. 第一种:添加“--plink-tped”参数: 用vcftools的“--plink”参数生成plink格式文件时,小样本量测试可以正常生成plink格式,用大样本量时产生W ...

  2. 第十二节,TensorFlow读取数据的几种方法以及队列的使用

    TensorFlow程序读取数据一共有3种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFlow图的起 ...

  3. error:crosses initialization of ...

    switch(c) { case 0x01: int temp = a + b; .... break; case 0x02: break; default:break; } 此时会报如题所示错误 原 ...

  4. hdu 4352 "XHXJ's LIS"(数位DP+状压DP+LIS)

    传送门 参考博文: [1]:http://www.voidcn.com/article/p-ehojgauy-ot.html 题解: 将数字num字符串化: 求[L,R]区间最长上升子序列长度为 K ...

  5. jQuery的on绑定事件在mobile safari(iphone / ipad / ipod)上无法使用的解决方案

    用一个div当做了一个按钮来使用. <div class="button"> <div class=" next_button button_left ...

  6. (栈)leetcode 946. Validate Stack Sequences

    Given two sequences pushed and popped with distinct values, return true if and only if this could ha ...

  7. Qt ------ 添加某个功能,比如(QSerialPort)注意事项

    添加某个功能,比如(QSerialPort),不仅需要保护头文件 还需要在.pro文件内添加 QT += serialport

  8. IIS 错误:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

    HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 可能是缺少处理程序映射.默认情况 ...

  9. opencv: 基本知识;

    注: 该篇博文为扩展型,后期将逐步进行扩展: 1. IplImage转Mat IplImage转Mat: IplImage *pImage = cv::loadImage(“”); Mat imgM ...

  10. bzoj4034 线段树+dfs序

    https://www.lydsy.com/JudgeOnline/problem.php?id=4034 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 ...