java中包装类Integer的 == 比较分析

直接上代码,当int值在一个字节范围内(-128~127)时:

 

当int值不在一个字节范围内时,例如128(注意与第一张图结果的区别)如下图:

我们根据比较结果逐行分析:

第一行:可以看到 int 类型的数据与Integer对象的比较全部都为 true,这是因为,当int与Integer比较时,java会将Integer类型自动拆箱转换为 int 再进行比较,所以到最后是 int 和 int 之间的值的比较,所以无论int值是否在一个字节范围内,比较结果均为true。

第二行:当我们把 int 值直接赋值给 Integer 对象,java会对 int 值进行自动装箱,而什么是自动装箱呢,就是调用 Integer 的valueOf方法,所以这里 Integer b = 100 和 Integer c = Integer.valueOf(100) 的效果完全是一样的,那为什么当int值为100时,比较结果为true,而当int值为128时比较结果为false呢?

我们来看源码:

这是因为Integer类在自动装箱时,如果int的值在一个字节范围内,直接返回缓存,如果超出了一个字节,则会新建一个对象返回,所以第一张图片b和c比较为true,而第二张图片比较为false。 而由于d和e均为新建了一个对象,所以b和他们的比较均为false。

第三行:由于d和e均为新建了一个对象,而==默认比较的是对象的地址,所以除了与int值比较会自动拆箱转换为int值进行值的比较之外,d和e与除了a之外的任何对象的==比较均为false。

第四行:参考第三行。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值