kotlin中“==”和“===”的区别
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中“==”和“===”的区别的更多相关文章
- Kotlin中?和!!的区别
很多同学刚上手使用Kotlin知道它有针对Java NullPointerException的管理,而在Kotlin中?和!!均是和NullPointerException有关系,可他们的区别到底是什 ...
- Kotlin中的object 与companion object的区别
之前写了一篇Kotlin中常量和静态方法的文章,最近有人提出一个问题,在companion object中调用外部的成员变量会调用不到,这才意识到问题,本篇文章会带着这个疑问来解决问题. 一. obj ...
- Kotlin中与Java不同的地方 需要注意
1. 在Kotlin中不会将基本数据类型的自动转型比如 scriptIntrinsicBlur.setRadius(25) //报错, 必须写成 25f 或者 调用.toFloat() 2.Kotli ...
- Kotlin中常量和静态方法
常量 Java中: class StaticDemoActivity { public static final String LOAN_TYPE = "loanType"; pu ...
- 浅谈Kotlin中的函数
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/UV23Uw_969oVhiOdo4ZKAw作者:连凌能 Kotlin,已经被Android官方 ...
- kotlin中的嵌套类与内部类
Java中的内部类和静态内部类在Java中内部类简言之就是在一个类的内部定义的另一个类.当然在如果这个内部类被static修饰符修饰,那就是一个静态内部类.关于内部类 和静态内部类除了修饰符的区别之外 ...
- Kotlin中变量不同于Java: var 对val(KAD 02)
原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ...
- MyBatis Mapper.xml文件中 $和#的区别
MyBatis Mapper.xml文件中 $和#的区别 网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramN ...
- (实用篇)PHP中unset,array_splice删除数组中元素的区别
php中删除数组元素是非常的简单的,但有时删除数组需要对索引进行一些排序要求我们会使用到相关的函数,这里我们来介绍使用unset,array_splice删除数组中的元素区别吧 如果要在某个数组中删除 ...
随机推荐
- C++基础知识--DAY3
今天我们开始进入封装类的地方 Encapsulation(封装) (1) C struct数据封装 当单一变量无法完成描述需求的时候,结构体类型解决了这一问题,可以将多个类型打包成一体,形成新的类型 ...
- Codeforces Round #525 (Div. 2)
Codeforces Round #525 (Div. 2) 哎,忍不住想吐槽一下,又要准备训练,又要做些无聊的事,弄得我都想退出了. 好好的训练不好么???? 只能做出两道水题,其实C题,感觉做出来 ...
- ZOJ 1532 Internship (Dinic)
看来模板又错了,敲你妈妈小饼干 #include<iostream> #include<queue> #include<cstring> #include<c ...
- 干货分享:互联网运营 学习SEO从零开始 SEO深度解析学习笔记
最近在自学SEO,互联网运营,把做的笔记干货分享给大家啊! 希望能帮到大家,如有好的建议可以关注我[磨人的小妖精]或留言,大家一起探讨. 之前还写过一篇文章互联网运营+SEO:推荐必看的5本书籍,学习 ...
- systemd 编写
转载文章:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html https://wizardforcel.gitb ...
- 剑指Offer_编程题_17
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) /* struct TreeNode { int val; struct TreeNode * ...
- Scoring and Modeling—— Underwriting and Loan Approval Process
https://www.fdic.gov/regulations/examinations/credit_card/ch8.html Types of Scoring FICO Scores V ...
- Neo4j社区版配置文件
#*****************************************************************# Neo4j configuration## For more d ...
- SQL知识以及SQL语句简单实践
综述 大家都知道SQL是结构化查询语言,是关系数据库的标准语言,是一个综合的,功能极强的同时又简洁易学的,它集级数据查询(Data Quest),数据操纵(Data Manipulation),数据定 ...
- python 函数动态参数,名称空间,global,nonlocal
##################################总结######################################动态参数 *args:位置参数动态传参,接收到的是元 ...