老铁,你确定你懂JAVA的Auto Box / Unbox吗? 那么先来做几个小题
public class Autobox_Test { public static void main(String[] args) { Integer c = 3; Integer d = 3; Integer e = 365; Integer f = 365; Integer g=730; Long h = 365L; System.out.println(c==d); System.out.println(e==f); System.out.println(g==(e+f)); System.out.println(g.equals(e+f)); System.out.println(g.equals(f+h)); } }
Emmm,下面是答案来了
如果你有疑问,那么看到这篇文章算是你捡到宝了,全部做对的,我也佩服你基础十分扎实。下面开始正题:
第一个 c==d 不解释。但是对于第二个 e==f 为false可能有一部分同学不明白。这里false的原因在于 == 左右俩个操作数都是包装器类型的引用时(包装器类型引用: 如 基本数据类型int 其有包装器类型Integer),则是比较其是否为同一个对象,而JAVA的Integer缓存着-127~127,所以产生了 c==d 为true 而e==f 却为false。关于第三个 g==(e+f),此时由于 == 的右侧为算数运算,则会自动拆箱( e.intvalue()+f.intvalue() ),比较两侧的数值,相等则为true。关于第四个g.equals(e+f),e+f先自动拆箱计算,又由于equals,再次将其自动装箱Integer.valueof(),所以为true。关于第五个,和上面的类似,只不过系统自动装箱Long.valueof(),导致两者类型不同false。 若老铁不太明白,下面讲述自动装箱和拆箱。
Integer i=1;
int j=i;
这是一个Auto Box/Unbox 的典型例子。在第一句中JVM为我们自动执行了 Integer i=Integer.valueof(1);实现了自动装箱的一个过程。第二句则是 int j=i.intvalue();实现了自动拆箱的一个过程,这下要清晰不少吧。明白了这些自动装箱,拆箱,和我们日后写代码调优有不少好处。
相关重要函数:
1.Integer.valueof(parameter) 将parameter当入参数 返回一个Integer对象。
2.Integer.parseint(parameter) 将parameter当入参数 返回一个int对象。
3. Integer.valueof(parameter).intvalue() 将parameter当入参数 返回一个int对象。
文章中可能有错误之处,还请老铁指出,谢谢。