该用户从未签到
|
今天碰到有人咨询java的自动装箱和自动拆箱有关的问题,以及equal和==的区别,详情如下,以下的两组变量: Integer m = 128; Integer n = 128;
0 U/ `2 p+ L. ~9 O6 Z. E; z3 ` Integer a = 127; Integer b = 127;
1 \' P4 X/ }' e
( n% y9 G9 }+ ? G a y9 U8 x5 E& q, K8 E
m.equal(n) 以及a.equal(b)显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。3 k5 \2 _) m4 W2 D
所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等2 G, I- P5 D4 G1 W2 ?
/ H# k% _ b1 x' \
但m==n的结果是不相等的。
+ l' Y7 h2 {* h+ N" _3 s, \# r==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。& j3 w0 y9 X+ z# ?2 _/ E3 \) `4 H
! a* g& w3 y) j5 R1 a
但a==b 结果是相等的。显然比较的内容相等。) L9 w- T* w- Y: ^) g9 W
* y) W' P: P( k! P% ?3 k# [
为什么m==n 判断为false,但a==b 却判断为true呢,原因是什么?! u& _ [# @9 |# q
由于自动装包,它们其实都是装在一个Integer对象中。. U8 a3 @6 R1 D* @
这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,
+ ^7 F3 T$ X0 r; z, Q$ hchar<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。
% ^' k# d( u" k( ]4 [
& m2 \' y" O" F2 k' M# E |
|