应该用==,如下实测:
1
2
3
4
5
6
7
8
9
10
11
|
class
Test
{
public
static
void
main(String[] args)
{
Long L =
new
Long(
2
);
System.out.println(
"L\ti\tL==i\tL.equals(i)"
);
for
(
int
i=
0
; i<
5
; i++) {
System.out.printf(
"%d\t%d\t%b\t%b\n"
, L, i, L==i, L.equals(i));
}
}
}
|
程序运行结果如下:
为什么会这样?只需看看Long.equals()的源码就知道了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
final
class
Long
extends
Number
implements
Comparable<Long> {
// 省略...
private
final
long
value;
public
Long(
long
value) {
this
.value = value;
}
public
boolean
equals(Object obj) {
if
(obj
instanceof
Long) {
return
value == ((Long)obj).longValue();
}
return
false
;
}
// 省略...
}
|
L.equals(i)执行时,i被转为某种对象类型后,被equals()方法参数obj引用,if (obj instanceof Long)测试失败,所以直接return false;
这里obj所引用的实际类型到底是什么?可以通过源码调试看出(Eclipse能正确找到源码路径才行)。也可以通过下面的程序模拟:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class
FooLong
{
private
final
long
value;
public
long
longValue() {
return
value; }
public
FooLong(
long
value) {
this
.value = value; }
public
boolean equals(Object obj) {
System.out.println(obj.getClass());
if
(obj instanceof Long) {
return
value == ((Long)obj).longValue();
}
return
false
;
}
}
class
FooTest
{
public
static
void
main(String[] args)
{
FooLong f =
new
FooLong(123);
System.out.println(f.equals(123));
System.out.println(f.equals((
long
)123));
}
}
|
运行结果如下:
可以看到,填int的f.equals(123),obj引用123时,实际引用的是java.lang.Integer类型
long时,实际引用的是java.long.Long类型