Integer类型进行数值比较出现不相等的原因分析

先看如下一段代码,这是进行Integer数值比较的几种方法,第一种是直接使用==逻辑运算符进行比较,第二种是使用equals方法进行比教,第三种方法是利用Integer对象的intValue()方法将类型转变为int类型进行比较

public class test {
    public static void main(String[] args) {
        Integer a = 127;
        Integer b = 127;
        Integer c = 128;
        Integer d = 128;
        if(a==b){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
        if(c==d){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
        if(c.equals(d)){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
        if(c.intValue()==d.intValue()){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
    }
}

比较结果如下:
在这里插入图片描述
我们发现了一个有趣的现象,当Integer的值为127时使用“==”进行比较时,结果为true,而当用该方法进行数值128的比较时,结果就为false了。

到底是什么原因呢?
来通过dubug进行探寻
在这里插入图片描述
我们发现a和b的值不仅相同,而且地址也相同,但是c和d只有值是相同的,但是地址却是完全不同的。由于“==”是进行地址的比较,这就解释了为啥c和d比较结果为false了。
JVM的基本类型的常量池中,int初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer 为128时,128不在常量池范围内,所以在自动装箱过程中需new Integer(128)操作,所以地址不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值