关于自动拆箱跟自动装箱的问题求解

图片说明

求解答案为什么是这些

这是Integer和Long的equals方法的源码:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
这样就可以很清楚解释以上现象啦~
首先是倒数第四行,abc全部是是Integer,所以b+c的结果是Integer对象,自然返回Ture;
至于倒数第二行和倒数第一行则是因为a+b的结果是Integer,所以为直接返回False;计算a+h的过程中发生了类型提升,结果为Long,所以就调
用了longValue(),自然为True;
第一行和第三行以及倒数第三行均可以用缓存解释~
至于第二行则是==与equals方法的区别,首先a==b比较的并不是ab代表的内容,而是其内存地址,即引用对象是否是同一个;
c,d均来源与缓存区,自然地址一样(不是数字一样);而e和f则来自堆栈,相当于new出来的,自然地址不一样啦。
ok,希望我的解释对您有用

JAVA的自动装箱的作用就是:可以将基本数据类型按照对象来使用,以调用其方法;
然后自动拆箱的作用就是:可以使对象变成基本数据类型进行加减乘除;
这样理解对吗?
Integer a=1;//这就是一个自动装箱,如果没有自动装箱的话,需要这样Integer a=new Integer(1)
int b=a;//这就是一个自动拆箱,如果没有自动拆箱的话,需要这样:int b=a.intValue()

这样就能看出自动装箱和自动拆箱是简化了基本数据类型和相对应对象的转化步骤

关键是倒数4行 结果为什么是这样,自动装箱拆箱跟-128-127的缓存我都懂

你可以看一下valueOf的源码-128-127之间会直接从常亮中取值,而其他数据会创建一个对象

因为-128到127是缓存的,所以每次拿的对象就是同一个 ,而e ==f为false 就因为 当自动装箱的时候,编译器欺骗了你,
在运行时候他是直接创建新的对象,默认的equals比较的是对象的Hash值,所以不会相等

关于c.equal(a+b),你知道自动拆装箱的话,那么疑问点就在于equals()了,原因在于Integer重写了方法,它比较的里封闭在Integer里的int的值。

这是Integer和Long的equals方法的源码:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
这样就可以很清楚解释以上现象啦~
首先是倒数第四行,abc全部是是Integer,所以b+c的结果是Integer对象,自然返回Ture;
至于倒数第二行和倒数第一行则是因为a+b的结果是Integer,所以为直接返回False;计算a+h的过程中发生了类型提升,结果为Long,所以就调
用了longValue(),自然为True;
第一行和第三行以及倒数第三行均可以用缓存解释~
至于第二行则是==与equals方法的区别,首先a==b比较的并不是ab代表的内容,而是其内存地址,即引用对象是否是同一个;
c,d均来源与缓存区,自然地址一样(不是数字一样);而e和f则来自堆栈,相当于new出来的,自然地址不一样啦。