该用户从未签到
|
今天碰到有人咨询java的自动装箱和自动拆箱有关的问题,以及equal和==的区别,详情如下,以下的两组变量: Integer m = 128; Integer n = 128;
: s5 y0 ?- ~' b/ `0 { Integer a = 127; Integer b = 127;
1 j' Y( A s5 X
3 F x" f0 j; _6 }0 R) g% f" w" b/ Q4 _5 N8 |1 k' C0 V
m.equal(n) 以及a.equal(b)显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。
: H: y/ w& z3 ]1 a9 }所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等/ I$ c8 W1 \' M" o8 t
/ J0 z1 k5 C/ {3 i# l3 E6 g, S; _2 D但m==n的结果是不相等的。
/ M- b8 U( q# `1 Y2 h" e==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。- h3 [; L8 s# b/ e) l
) g) B9 q2 v! A3 m4 Z
但a==b 结果是相等的。显然比较的内容相等。
4 ?/ C; j6 w u3 N- i3 o% }( F4 W5 B! \( S0 q [6 I, E
为什么m==n 判断为false,但a==b 却判断为true呢,原因是什么?
# C# O: x( }# W# q& I由于自动装包,它们其实都是装在一个Integer对象中。! h& g; h. K/ b6 t
这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,
3 Z% W6 B4 ~. c- p& }char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。 x* ]5 x3 e4 P6 z. d$ T
2 B# X; s% F3 X$ |: d1 @ |
|