关于java中和kotlin中的 == ,===,equals 比较

java首先要分引用基本数据类型和引用数据类型

基本数据类型一共八个,其他的像 String  类 Date 都是引用数据类型也称复合数据类型

基本数据类型如下:

byte  8位

short 16位

int  32位

long 64位

char16位

这5个都可以归为整数类型,我之前一直记不住,现在按照这个顺序从少到多  记就记住了

小数类型2个

float 32位

long 64位

在加一个boolean

=================================分割线==========================================================

先研究java中的== 和equals

在基本数据类型中== 比较的是他们的值 

equals不能用来比较基本数据类型,只能比较复合数据类型

因为java中所有的类都继承于object, objcet定义了equals方法,这个方法的初始行为是比较内存对象的.但是像String,Integer,Date这些类中已经复写了equals方法,所以不再是比较类对象在堆内存中的存放地址了

然后翻object的equals方法, 

equals 就等价于==  就是比较2个对象在堆内存中存放的地址,

 结论:==用在复合数据类型的时候就是比较2个对象在内存中的存放地址,而equals 在不被复写的情况下,等价于equals

接下来研究一下String的equals源码,

首先如果  他的内存地址一样,就直接相等了,如果不一样,则比较字符串里面的每个字符

结论:如果两个字符串所有字符都一样,则相等.  其实就是比较2个字符串的值是否一致.

java唯一有点小区别的是int装箱问题, 在-128~127的Integer值并且以Integer x = value;的方式赋值的Integer值在进行==和equals比较时,都会返回true,因为Java里面对处在在-128~127之间的Integer值,用的是原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行==比较时只是进行int原生数据类型的数值比较,而超出-128~127的范围,进行==比较时是进行地址及数值比较。
 

Integer a = 1000;
        Integer b = 1000;
        System.out.println("a==b----------" + (a==b));
结果是false
Integer a = 10;
        Integer b = 10;
        System.out.println("a==b----------" + (a==b));
结果是true

了解完java  在看看kotlin,kotlin有三个表示相等的符号  ==, ===和equals

==用来比较2个变量的值,只比较值,  区别于java的== 在比较复合数据类型的时候是比较2个对象的地址

=== 用来比较2个对象的地址,如果用在基本数据类型中 则和== 一样表示比较2个变量的值

.equals  这里的实现是根据每个继承Any 类中的equals 方法体来决定的 ,这里的any相当于java的object

要区别的是 根据IEEE754标准,  

NaN equals 他自己

NaN比任何包含在POSITIVE_INFINITY的元素都大

比较float和long的时候

-0.0比0.0小

基本数据类型时功能一样,比较的时对象的值

       val a = 10

       val b=10

        a==b //true

        a===b //true

       a.equals(b) //true

在用 == 和===的时候两边对象不同,编译的时候会直接报错

比如 1==1L

1==1.0

1.0==1.0f

这样编译器就会报错

val  a= 111

val b=111

a===b //true

再看看 类似java的装箱问题,再kotlin中就不会出现

但是如果val a =1000

val b=  1000

a===b   

但是  我试验了下   结果是true

写个简单的类

class Person(name: String) { var name:String? = name }

val  a=Person("aa")

val  b=Person("aa")

a===b  返回false  其实就是2个对象指向的地址不同导致false

但是 a==b  返回true  因为2个对象 里面变量name的值是相同的

我知道这篇文章还有很多不足,以后再更新吧,欢迎小伙伴给我可以研究的链接

猜你喜欢

转载自blog.csdn.net/xiexiaotian11/article/details/87188196
今日推荐