|
该用户从未签到
|
今天碰到有人咨询java的自动装箱和自动拆箱有关的问题,以及equal和==的区别,详情如下,以下的两组变量: Integer m = 128; Integer n = 128;
+ T8 I9 Y( K2 x' ~" h Integer a = 127; Integer b = 127;
0 g5 D' j: p& B* c
& p5 d4 W, {8 E: b+ F( H4 Y/ t: Z4 W' O8 n! L" {0 m8 j6 p( O
m.equal(n) 以及a.equal(b)显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。
2 y, J: e+ F+ T! l k! E. Z所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等5 y4 i- T* f, y# l# w: U
& c1 h: O- \4 s K% c1 p7 R但m==n的结果是不相等的。
# z* l* \6 ]' X' @) c* ^. m$ i==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。
3 i5 h/ H \5 W7 C, ~3 d
7 E* C* v/ i) k, i# `! k8 @3 C但a==b 结果是相等的。显然比较的内容相等。9 E4 z, j' b% U* w' G9 H
3 {) ^9 G) N- v; m
为什么m==n 判断为false,但a==b 却判断为true呢,原因是什么?( a2 l7 O7 i2 s
由于自动装包,它们其实都是装在一个Integer对象中。; Q1 j0 v7 U- E: `6 }
这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,
p1 B) j3 i: ^char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。
# ^* C* m# r8 H/ K' r( D
$ ]! v- y6 }4 A0 x9 ]8 X2 P |
|