该用户从未签到
|
今天碰到有人咨询java的自动装箱和自动拆箱有关的问题,以及equal和==的区别,详情如下,以下的两组变量: Integer m = 128; Integer n = 128;" d9 Q9 ]7 g4 h8 C- W1 H2 ~
Integer a = 127; Integer b = 127;! r0 U$ N1 t0 l- s" J: c# Z% P2 J! b% A: w
" N8 T1 j N6 a) j+ f, U2 O4 v* m9 ^
m.equal(n) 以及a.equal(b)显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。
6 P; g$ v! d/ O; p3 j所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等
6 A3 E3 ?3 N5 e8 U. D5 Q0 v5 o( h* e0 N' T
但m==n的结果是不相等的。1 A& ], v7 L* `6 B$ g) N) g1 |4 W% i
==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。
1 R; o/ h( U1 n7 ^5 e# u g: C1 H9 Z6 ^8 h0 ?8 t" |/ x/ T
但a==b 结果是相等的。显然比较的内容相等。
; `' {4 Y, }3 w, K7 m" P1 f& w* K
$ P% s8 O8 y) I9 j( b0 i4 H为什么m==n 判断为false,但a==b 却判断为true呢,原因是什么?
% [) p7 G9 g0 B( s. j由于自动装包,它们其实都是装在一个Integer对象中。9 {' |3 L8 k4 O7 a
这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,7 a( b4 [5 k' }5 R% D$ @( ]
char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。
+ B+ b: [ F, ]) ?( `' G) Q: V. \, Q9 Z3 W, K/ I4 U2 t7 q
|
|