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的值是相同的
我知道这篇文章还有很多不足,以后再更新吧,欢迎小伙伴给我可以研究的链接