今天碰到有人咨询java的自动装箱和自动拆箱有关的问题,以及equal和==的区别,详情如下,以下的两组变量: Integer m = 128; Integer n = 128; 2 p/ H0 T5 H4 `/ o: U Integer a = 127; Integer b = 127;3 q# n9 C% C9 p+ K' o0 d# z
( e: u. q$ r7 l0 ~( u/ f l
( Y- H. ]. ?7 B/ [6 [" [m.equal(n) 以及a.equal(b)显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。 . M* h: G* b( R3 O% C1 Y+ N' ^6 W所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等$ k2 b+ s2 K8 R4 ^$ C) F
6 A' `( m2 P) z2 ~: I# D1 W
但m==n的结果是不相等的。3 S% ^, z7 W+ R, C
==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。 0 M8 K) q6 ?7 K3 |, U; V0 a) L% u' ^. }/ l* w( E
但a==b 结果是相等的。显然比较的内容相等。 ( k% k- B7 i0 f$ [! a3 v & B- `( Y, |% [2 ~! N为什么m==n 判断为false,但a==b 却判断为true呢,原因是什么?" W5 ^! Y/ r* |2 X' Q9 o
由于自动装包,它们其实都是装在一个Integer对象中。 : W, |' ~& `. G这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中, 4 B6 S6 b p7 Y2 X6 Nchar<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。 : ~* u8 J( R/ y- E# q& K) s) I- r