kotlin的运算符“==="我倒是第一次见,不知道别的语言里面有木有。它对”==“的功能地位产生了影响,搞得我有些糊涂,特此整理。
一、先回顾一下Java里面相应的运算符的情况
在Java中有8种基本数据类型:
- 浮点型:float(4 byte)
- 双精度:double(8 byte)
- 整型:byte(1 byte)
- 短整型:short(2 byte)
- 整形:int(4 byte)
- 长整型:long(8 byte)
- 字符型: char(2 byte)
- 布尔型: boolean("true"和"false")
对于这8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。举个例子:
int a=3;
int b=3;
print(a == b);
变量a和变量b都是直接存储的"3"这个数值,所以用==比较的时候结果是true。
而对于非基本数据类型的变量,在一些书籍中称作为 引用类型的变量。比如String就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。可以说,”==“判断的是两个对象是否”引用相等“。而equals方法不能作用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的也是引用类型的变量所指向的对象的地址;但是诸如String、Date等类对equals方法进行了重写,所以它们比较的是所指向的对象的内容,可以理解为equals()判断两个对象是否“内容相等”。
二、现在正式聊聊kotlin中的道道儿
先来一段代码看看。
var str1 = "chaychan"
var str2 = "chaychan"
println(str1 == str2)
println(str1.equals(str2))
比较两个字符串,如果两个字符串的内容一致,在Java中使用str1 == str2
时,是比较两个字符串的地址值,两个字符串的地址不一样,将会返回false,但是在kotlin中,则不是如此,”==“比较的只是字符串的内容,即判断“内容相等”;与此同时,equals()所做的也是判断“内容相等”。如果要判断对象是否“引用相等”则需要使用“===”。所以,上述的两个判断结果都为true。顺便提一下,如果你这样做:println(str1 === str2)
。返回结果也是true,你并没有生成两个对象。好啦,先写这些。