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);
网友评论