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比较得到结果返回。