java中包装类型比较问题

1.在java中基础数据类型int,long,float,double...等等对应的包装类为Integer,Long,Float,Double...

在对数据进行比较的时候如

int a = 1000;int b=1000;

if( a == b){
    return true
}else{
    return false
}

我们都知道程序运行的结果是true;

2.但是包装类情况就不一样了

先来一段代码,直接上图
我们拿Integer做示范


代码片段1

可以看到a1和a2同样是100 比较两个值时得到了正确的结果,但是b1和b2的值虽然都相同但是比较的结果时false

为什么会出现这种情况呢?

我们先要明白一件事,包装类的对象是对象,对象用==比较的是对象的地址

Integer b1 = 1000; 其实b1 是一个对象,是java自动把1000包装成Integer对象(new Integer(1000))并赋值给b1
同理b2也是一个对象,此时使用==,那么比较的是b1和b2的对象地址,当然为false啦;

那么为什么100又能使用==比较呢?

原来包装类型Integer在内部会对较小的数值进行缓存(-128 ~ 127),然后其他的Integer对象若是拿-128 ~ 127的值是直接从缓存拿的,我摘取一段Integer类的源码


integer内部源码1

integer内部源码2

很明显此时的a1 和 a2都是IntegerCache中的同一个缓存,所以可以直接用==比较

3.如何正确使用方式

其实也很简单
我们可以使用Integer类的intValue()获取值后进行比较
b1.intValue() == b2.intValue()


integer内部源码3
integer内部源码4

或者使用equals()方法,Integer对equals进行了重写,源码是这样的


integer内部源码5

b1.equals(b2);

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容