该用户从未签到
|
今天碰到有人咨询java的自动装箱和自动拆箱有关的问题,以及equal和==的区别,详情如下,以下的两组变量: Integer m = 128; Integer n = 128;
" e1 R! ?6 b4 ^$ U2 _+ `9 } Integer a = 127; Integer b = 127;1 ~: a: Q. ~( ?0 i4 Z6 k
. }* @9 l* }# G% l
* g) @3 E6 {1 H9 i4 {9 P
m.equal(n) 以及a.equal(b)显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。3 _* d- I3 _1 t- o+ ^$ C
所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等) P' o' s* l. C9 w# i# \
/ y% W8 C' N4 P, ~! }) m$ n k但m==n的结果是不相等的。
8 V# O" e( {3 @# {. J' S' J- w1 e==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。( Q" k7 N* e( x( Z/ R+ O7 e5 y
- c: n+ w1 s# P0 A% @) N但a==b 结果是相等的。显然比较的内容相等。/ ]9 L8 W5 w% i4 g& D$ r4 ^0 W/ D
, ^% w# a# K. |% u为什么m==n 判断为false,但a==b 却判断为true呢,原因是什么?
* Q+ [9 u q2 \; k4 [% c' N由于自动装包,它们其实都是装在一个Integer对象中。
, h9 B! f, D. u# Z3 _ w( J这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,4 H0 h' K! P4 I
char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。* ]2 r( b# z5 j/ r
n! e' _' f( R7 V: R! D) N |
|