中易网

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

答案:1  悬赏:10  
解决时间 2021-01-19 23:30
Long和int比较用==还是用equals
最佳答案
应该用==,如下实测:
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类型
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
沃克酒店地址好找么,我有些事要过去
中国移动(临江中心指定专营店)地址有知道的么
男人透女人的的故事
北京群众演员
谁有幼儿大班音乐《巴塞罗那奥运会》的教案
别问值不值得,只有愿不愿意
去靳家岭,不走高速怎么走
1982年农历6月22是公历多少号
7月份去北京还是厦门
李白成舟将欲行
素描正三边形多面球体视频或图解画法
中国陆军征兵都必须满足什么要求?
问女生今天过得好吗,她说每天都过得挺好
36集老版亮剑
求。 all火神的耽美文
推荐资讯
ZB一YJV一B一5x2.5电缆是什么意思
考研复习,现代管理心理学(程正方主编)和管
谁给分一下
以元旦为主题写一段话?一年级的作业
头皮上之前有点痛,像长疖子一样。长大了长硬
乱按下了个午夜迷情的软件卸载不了怎么办,用
笔记本电脑温度太高怎么办
患有美尼尔综合症的人38岁生小孩有危险吗 身
英语outooor是什么意思
as....as之间用什么词?那为什么as quickly as
企业怎样通过产品质量认证
怎么查老公订机票有没有和其他人一起
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?