« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
关注电子政务、大型企业应用开发、Web、Workflow、MOM、MDA、RCP、GEF email:gmluyang@gmail.com
|
Blog信息 |
blog名称:SixSun的Blog 日志总数:152 评论数量:372 留言数量:13 访问次数:2372843 建立时间:2004年12月13日 |

| |
[J2SE / 基础类]诡异的autoboxing与unboxing 随笔, 读书笔记
SixSun 发表于 2006/3/8 0:09:00 |
autoboxing、 unboxing
再来看一个,先看看程序,您以为结果是如何?
Integer i1 = 100;Integer i2 = 100; if (i1 == i2) System.out.println("i1 == i2");else System.out.println("i1 != i2");
以自动装箱与拆箱的机制来看,我想您会觉得结果是显示"i1 == i2",您是对的!那么下面这个您觉得结果是什么?
Integer i1 = 200;Integer i2 = 200; if (i1 == i2) System.out.println("i1 == i2");else System.out.println("i1 != i2");
结果是显示"i1 != i2",这有些令人讶异,语法完全一样,只不过改个数值而已,结果却相反。其实这与'=='运算符的比较有关,'=='可用来比较两个基本型态的变量值是否相等,事实上'=='也用于判断两个对象变量名称是否参考至同一个对象。所以'=='可以比较两个基本型态的变量值是否相等,也可以判断两个对象变量的参考对象是否相同,当您如前两个程序的方式撰写时,编译器不知道您实际上要比较的是哪一种?所以对于值从-128到127之间的值,它们被装箱为Integer对象后,会存在内存之中被重用,所以当值在100,使用'=='进行比较时,i1 与 i2实际上参考至同一个对象。如果超过了从-128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次都新建一个Integer对象,所以当值在 200,使用'=='进行比较时,i1与i2参考的是不同的对象。 |
|
|