该用户从未签到
|
今天碰到有人咨询java的自动装箱和自动拆箱有关的问题,以及equal和==的区别,详情如下,以下的两组变量: Integer m = 128; Integer n = 128;3 O/ j4 x" ]9 P8 r1 ? ?3 }
Integer a = 127; Integer b = 127; m$ G5 G/ W8 v5 k3 q
2 c6 s* Z/ Y# X ?3 y1 P- T! n
& y% |0 D$ k7 F3 M. _4 Nm.equal(n) 以及a.equal(b)显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。
, G3 l# ^4 Y6 w所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等. {7 U4 _0 h- E! H9 g% `
0 Q/ h2 C) c. \
但m==n的结果是不相等的。
4 W7 }- M* J& L==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。
8 X# ], l' H+ T
7 x2 O1 C7 `4 `8 M但a==b 结果是相等的。显然比较的内容相等。
" Z5 S5 J( Z# S8 a6 D& l" r2 }' e, S
为什么m==n 判断为false,但a==b 却判断为true呢,原因是什么?
* a3 W. \" W. I由于自动装包,它们其实都是装在一个Integer对象中。
+ E u5 T G. N# w n! z这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,
6 [6 M& U' I% m8 S- Rchar<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。
$ t5 V+ w3 ]' M4 ]% n2 d% B) o, i- o: V# f2 I* e, f
|
|