如图Java基础题,==比较大小

Inteager在-127_128就会引用同一个对象,比较会为true,除了Inteager以外其他几个包装类都没有这样一个特性吗?下面两个false是因为装箱内部都new对象了吗?下面的解释没有看懂,请dl指点一下

img

  • 当 "=="运算符的两个操作数都是包装器类型的引用,是比较指向的是否是同一个对象

  • 通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象

  • 而Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现,在某个范围内的整型数值的个数是有限的,而浮点数却不是

  • 因为i1、i2、i3、i4是浮点数,数组则是分别指向不同的对象,double的范围是1.79769e+308 ~ 2.22507e-308,创建对象的时候,范围很大,不用返回指向cache中已经存在的对象的引用

int的源码中,已经创建好一个数组,用来保存-128到127的整数,以便提高效率。而浮点型,在特定范围内是有无限个的,比如从0到1,有0.01,0.001.......,因此无法提前创建好数组

记住double和Double是不一样的,double是基本数据类型,不是一个类;Double是对double进行装箱的一个类。所以会产生对象,然后对象的内存地址不一样,结果就为false啦。

==是对比值类型数据
equals 是对比引用类型数据

double比较的是值大小,Double比较的是指向值的内存地址,内存地址不一致也就是false

基本数据类型用==比较的是值,包装类型用==比较的是内存地址

Integer里边有个内部类叫IntegerCache

Double肯定不可能啊,这么多可能的数值,没必要像Inteager那样