Java装箱和拆箱
2024-09-03 03:30:35
https://www.cnblogs.com/dolphin0520/p/3780005.html
http://mxdxm.iteye.com/blog/2028196
装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。
public class Main {
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;
Long h = 2L; 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));
System.out.println(g.equals(a+h));
}
}
先别看输出结果,读者自己想一下这段代码的输出结果是什么。这里面需要注意的是:当 "=="运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。另外,对于包装器类型,equals方法并不会进行类型转换。明白了这2点之后,上面的输出结果便一目了然:
true
false
true
true
true
false
true
第一个和第二个输出结果没有什么疑问。第三句由于 a+b包含了算术运算,因此会触发自动拆箱过程(会调用intValue方法),因此它们比较的是数值是否相等。而对于c.equals(a+b)会先触发自动拆箱过程,再触发自动装箱过程,也就是说a+b,会先各自调用intValue方法,得到了加法运算后的数值之后,便调用Integer.valueOf方法,再进行equals比较。同理对于后面的也是这样,不过要注意倒数第二个和最后一个输出的结果(如果数值是int类型的,装箱过程调用的是Integer.valueOf;如果是long类型的,装箱调用的Long.valueOf方法)。
如果对上面的具体执行过程有疑问,可以尝试获取反编译的字节码内容进行查看。
最新文章
- 数据库中char与varchar类型的区别
- 当一个页面出现多个checkbox全选时的处理
- 使用mvc3实现ajax跨域
- Android Small插件化框架解读——Activity注册和生命周期
- Greedy:Cleaning Shifts(POJ 2376)
- iOS socket编程 第三方库 AsyncSocket(GCDAsyncSocket)
- Android 之 MediaPlayer类
- 【转】Android 系统菜单与自定义菜单
- sqlserver 批量修改表前缀
- [Codeforces 696D] Legen...
- [LeetCode] Out of Boundary Paths 出界的路径
- 金融量化分析【day112】:因子选股
- springmvc映射html文件以及解决乱码问题
- 基于Spark自动扩展scikit-learn (spark-sklearn)(转载)
- 前端开发之css
- Jquery的一些常见用法
- Unix的哲学
- kubernetes 实战3_命令_Configure Pods and Containers
- (转)shlex — 解析 Shell 风格语法
- uboot下的命令使用示例