Integer类型==和equals比较(包含算术运算符)

Integer类型之==和equals用法比较(包含算术运算符)

学习纪录:(可能错误甚多)

​ 代码如下:

Integer a = 1;
Integer b = 2;
Integer c = 3;
System.out.println(c==(a+b));// cab顺序调用了intValue()方法进行拆箱
System.out.println(c.equals(a+b));

​ ctrl+鼠标左键点击Integer进入Integer源码,在valueOf方法和intValue方法打上断点。

​ 开始debug。

​ 可以看到(没有截图),前三个定义语句自动装箱都是调用了valueOf方法。

//Integer.java中部分代码
//value为Integer中的常量。通过valueOf可以获得赋值。(不是很懂)
private final int value;
//这个函数可以直接用,value就会得到值。也可以调用valueOf方法间接调用。
public Integer(int value) {
    this.value = value;
}
//valueOf函数
public static Integer valueOf(int i) {
	if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
//inValue函数,返回的value,而value就是Integer保存的基本数据类型
public int intValue() {
    return value;
}
//equals函数源码
public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

​ 而c==(a+b)部分(这里debug需要使用idea左下角调试箭头中的红色向下箭头即强制步入),则是cab的顺序调用了intValue方法。即是通过拆箱的方式将Integer类型转为基本数据类型int进行比较。

​ 而c.equals(a+b)部分,则是a和b分别调用intValue方法都变为基本数据类型进行计算,得到结果3,之后再调用valueOf方法装箱将int类型3变为Integer类型3。这里就和上面不一样,上面在将a和b进行拆箱之后没有进行装箱。

​ 接上,这样c和(a+b)两个包装器类型利用equals()方法进行比较(c.equals(a+b))。而c.equals()的本质也是将(a+b)传入之后(以Object类型传入),强制转换为Integer再调用intValue方法获得基本数据类型再和c中存储的基本数据类型value比较得到结果返回。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值