java中自动装箱拆箱的陷阱
来源:互联网 发布:java过滤所有html标签 编辑:程序博客网 时间:2024/05/18 10:09
本人曾经实习面试的时候遇到的一个java自动装箱的陷阱,当时就是不太明白,回来自己琢磨了一下这个问题,在此作为总结,
希望让刚开始接触java的同学以后避免这个坑!
好了废话不多说,直接贴出这段代码:
public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 321; Integer f = 321; 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自动装箱的一个非常常见的陷阱。在讲解这个问题之前,非常有必要
来说一个java规范:特定的基本类型一定得被box成相同的包装类型。这些对象会被高速缓存以重复使用,并且会被当做一般对象使用。
这些特殊的值是boolean值的true和false、所有的byte值、介于-128至127的short与int值,以及介于\u0000与\u007F之间的任何一个char
大家在理解上面所说的java规范,可能前两条的结果大家已经可以的出来了,由于介于-128至127的int值都会被高速缓存以重复
使用,所以第一个输出的结果为true。相反第二条输出的结果为false。
接下来再来讲解后面四条输出语句,首先我们先来说说(a+b)这个过程,其实这个过程是一个拆箱相加,然后装箱的过程。就是让a、b
先拆箱成int类型相加,然后在装箱成Integer类型去和c比较。这样大家应该猜到第3和第5输出语句都为true。
最后再来说一说第4和第6两条输出语句,如果我们在eclipse中,我们首先可以Ctrl第4条输出语句的equals方法,看看里面的源代码:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }如果大家理解了(a+b)过程,那么自然就会得到答案,因为传入的参数确实为Integer类型,所以第4条语句的结果为true。接着我们
可以Ctrl第6条输出语句的equals方法:
public boolean equals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } return false; }因为传入的参数为Integer类型,所以 if条件判断不成立,返回false。所以最后一条输出语句的结果为false。
最后贴上答案:
truefalsetruetruetruefalse
以上都是本人自己的理解过,若有不妥之处,请指正!
阅读全文
0 0
- java中自动装箱拆箱的陷阱
- Java自动装箱和自动拆箱的陷阱
- Java的自动装箱陷阱
- Java自动装箱的陷阱
- Integer的自动拆箱装箱陷阱
- java自动装箱陷阱
- java 自动装箱与拆箱 中的陷阱
- java 自动装箱与拆箱 中的陷阱
- Java自动装箱与拆箱及其陷阱
- Java自动装箱与拆箱及其陷阱
- Java自动装箱与拆箱及其陷阱
- Java自动装箱与拆箱及其陷阱
- 自动装箱与拆箱中的陷阱
- java的自动装箱自动拆箱
- 文章自动装箱的陷阱
- Java中基本数据类型的自动拆箱和装箱
- Java中基本数据类型的自动拆箱和装箱
- Java中自动装箱、拆箱的例子
- Seven Puzzle Aizu
- 队列小练习
- 图形与图像编程(四)-图像特效
- C++服务器程序崩溃的调试办法
- leetcode-最接近0的子数组和
- java中自动装箱拆箱的陷阱
- block
- 深度神经网络可视化工具
- 404错误处理进阶
- Mediacodec编码Camera摄像头数据技术要点总结
- JS 页面加载触发事件 document.ready和onload的区别
- 【PDF下载】红包在线技术峰会之红包背后:红与黑的较量
- redis3.0.5集群与spring集成
- Android基础之Java接口