最近看了一些书籍,发现其中有些地方还是比较容易让大家疏忽的,比如java的自动拆装箱,千万不要小看这个语法糖,如果不好好理解,当你觉得很简单很容易的时候,往往自己会在这里面挖坑,下面笔者通过自己的理解,加上整理了一下所阅读到的内容,给大家填一下坑。
public class GrammarSugar {
public static void main(String[] args) {
Integer a=1;
Integer b=2;
Integer c=3;
Integer d=3;
Integer e=128;
Integer f=128;
Long g=3L;
System.out.println(c==d);
System.out.println(e==f);
System.out.println(c==(a+b));
System.out.println(c.equals(a+b));
System.out.println(g==(a+b));
System.out.println(g.equals(a+b));
}
}
如果能准确回答出来,那么至少能说明你还是不错的,至少常量池、语法糖都有一定的了解。若你觉得某些地方不确定,那么,需要搞清楚了,因为可能实际写代码时,你已经不知不觉埋坑了!可怕的是这个坑自己还不知道……先来了解下拆装箱,题目答案后面揭晓。
什么是自动拆装箱?大家可以这么理解:
装箱,指的是基本数据类型自动转换成对应的包装类;
拆箱,指的是包装类自动转换成对应的基本数据类型。
java中为什么会有这玩意呢?其实就是为了减少开发人员的重复性工作,提升开发效率!
为了便于大家理解,下面用代码来说明具体拆装流程。
本章节忽略除了自动拆装箱以外的语法糖讲解(每一种语法糖都能说一章,所以忽略,有兴趣的自行研究)。
具体也用代码来展示给大家:
图中顺带说了一下循环遍历这个语法糖,其实是把代码还原成了迭代器的实现,这也是为什么遍历循环需要被遍历的类实现Iterable接口的原因了。
这里注意一下,文章开篇的题目中展示了两个变量e和f,为什么用128,而不用小数字,原因是为了抛砖引玉,大家需要事先了解常量池,这里也顺便给大家看下Integer.valueOf的源码实现,其实小于128的数字则直接从常量池中获取了,如图所示:
好了说了这么多,想必大家有所了解拆装箱了,该揭晓答案了,我直接run出结果给大家,一目了然,如图所示:
注意,如果我把e和f换成小于128的数字,则e==f就会为true了,原因在此前已经解释,不多说,而最后两行代码是大家格外要注意的,此前一直说的“坑”也在这里了,总结为两点:
1、包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱;
2、包装类的equals()方法不进行数据类型转换处理。
好了,本篇就到这里,最近比较忙,新文章更新有点慢,大家多担待了。
留言与评论(共有 0 条评论) |