该用户从未签到
|
今天碰到有人咨询java的自动装箱和自动拆箱有关的问题,以及equal和==的区别,详情如下,以下的两组变量: Integer m = 128; Integer n = 128;: M$ H( `) ~; k
Integer a = 127; Integer b = 127;
5 t+ [, d6 o/ x' P! R. Z+ p3 P7 i% C' {# B4 @# j" @9 {3 @, ]
* m$ R) G4 |: O, P
m.equal(n) 以及a.equal(b)显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。1 r+ b0 |7 o& L$ g- C
所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等
# I! K* r$ ?5 b7 t8 M; z- m) e2 Z2 A/ d) a8 s
但m==n的结果是不相等的。& l' s" O, h/ L- r& m
==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。9 a8 b4 ?8 ?, h
- F) p$ u t" \但a==b 结果是相等的。显然比较的内容相等。7 ^0 b9 y7 E$ [" Q: s5 W) `5 B) {$ k
4 a# K6 m3 A# B& Y+ k) N
为什么m==n 判断为false,但a==b 却判断为true呢,原因是什么?& o8 N; N: u9 i2 q) l- H
由于自动装包,它们其实都是装在一个Integer对象中。8 q2 o# q& m% ]2 f7 A
这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,: x- n% O$ e. Z
char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。
6 M0 f8 j( k- H0 `
, {1 @" B% ~: {" }4 I |
|