Long和int比较用==还是用equals
答案:1 悬赏:10
解决时间 2021-01-19 23:30
- 提问者网友:你独家记忆
- 2021-01-19 14:34
Long和int比较用==还是用equals
最佳答案
- 二级知识专家网友:英雄的欲望
- 2021-01-19 14:46
应该用==,如下实测:
class Test
{
public static void main(String[] args)
{
Long L = new Long(2);
System.out.println("L i L==i L.equals(i)");
for(int i=0; i<5; i++) {
System.out.printf("%d %d %b %b
", L, i, L==i, L.equals(i));
}
}
}程序运行结果如下:
为什么会这样?只需看看Long.equals()的源码就知道了:
public final class Long extends Number implements Comparable {
// 省略...
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能正确找到源码路径才行)。也可以通过下面的程序模拟:
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类型
class Test
{
public static void main(String[] args)
{
Long L = new Long(2);
System.out.println("L i L==i L.equals(i)");
for(int i=0; i<5; i++) {
System.out.printf("%d %d %b %b
", L, i, L==i, L.equals(i));
}
}
}程序运行结果如下:
为什么会这样?只需看看Long.equals()的源码就知道了:
public final class Long extends Number implements Comparable
// 省略...
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能正确找到源码路径才行)。也可以通过下面的程序模拟:
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类型
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯