Long和int比较用==还是用equals

应该用==,如下实测:

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类型

猜你喜欢

转载自youyanweixiao.iteye.com/blog/2204453