首先看一D代码(使用JDK 5Q,如下Q?br>
1 public class Test {
2 public static void main(String[] args) {
3 Integer i1 = 127;
4 Integer i2 = 127;
5 if (i1 == i2)
6 System.out.println("Equal!");
7 else
8 System.out.println("Not equal!");
9 }
10 }
输出l果惛_大家也知道,?#8220;Equal!”。现在把i1和i2的值由127改ؓ128看看会发生什么?l果输出“Not equal!”?br>
注意i1和i2都是IntegercdQ事实上只要q个值的范围?#8220;-128?27”之间Q输出结果都?#8220;Equal!”。JDK
5引进了很多新的特性,其中有一个就是自动装(AutoboxingQ和自动拆箱QAuto-UnboxingQ。当i1和i2gؓ128Ӟ在进?
“==”Ӟ它们被装q两个不同的Integer
ObjectsQ由于这是两个不同的instancesQ它们引用不同的内存地址Q所以结果是“Not equal!”?
但当q个值是127ӞJVM自动这个D{换成基本cdintQ这栯?#8220;==”ӞJVM仍然使用的是相同的object instanceQ?
所以输出结果ؓ“Equal!”了?br>
其实q与'=='q算W的比较有关Q?=='可用来比较两个基本型态的变量值是否相{,事实?=='也用于判断两个对象变量名U是否参考至同一个对象?br>
所
?=='可以比较两个基本型态的变量值是否相{,也可以判断两个对象变量的参考对象是否相同,当您如前两个E序的方式撰写时Q编译器不知道您实际上要?
较的是哪一U?所以对于g-128?27之间的|它们被装׃ؓInteger对象后,会存在内存之中被重用Q所以当值在100Q?=='q行?
较时Qi1 ?i2实际上参考至同一个对象?br>
如果过了从-128?27之间的|被装后的Integer对象q不会被重用Q即相当于每ơ都新徏一个Integer对象Q所以当值在 200Q?=='q行比较Ӟi1与i2参考的是不同的对象?br>
“Integer
i1 =
127;”在JDK1.5下可以编译通过的,q就是自动装(AutoboxingQ和自动拆箱QAuto-UnboxingQ。自动装?
QAutoboxingQ特性让Java自动包装一个简单数据类型(例如intQ到对应的包装类型中Q例如IntegerQ中?br> 在《JSR
201: Extending the Java Programming Language with Enumerations,
Autoboxing, Enhanced for loops and Static Import》中Q对q个问题Q是作了q样的规定:
If the value p being boxed is true, false, a byte, an ASCII character,
or an integer or short number between -127 and 128, then let r1 and r2
be the results of any two boxing conversions of p. It is always the
case that r1 == r2.
在Java中,The following is the list of primitives stored as immutable objectsQ不可变对象Q?
* boolean values true and false
* All byte values
* short values between -128 and 127
* int values between -128 and 127
* char in the range \u0000 to \u007F
]]>