Bug解决--比较对象属性值时equal方法和==的选择

本文深入探讨了Java中Long类型值比较的误区,通过具体代码示例,解析了为何在某些情况下使用==进行Long类型比较会得到错误结果,以及如何正确地进行值比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        以前老背面试题,equals和==有啥区别,看equals的源代码等等。实际工作中使用没有遇到这方面的问题。这次自己终于写了一个这方面的bug,然后自己玩了半天。

错误代码:

实体类A:

public class A {

    private Long id;

    private String name;
}

实体类B:

public class B {

    private Long id;

    private String name ;

    private Long fk_A_id;
}

测试类T--情况1:

       A a = new A();
       a.setId(1L);
       B b = new B();
       b.setFk_A_id(1L);
       if(a.getId()==b.getFk_A_id()){
           System.out.println(true);
       }else{
           System.out.println(false);
       }

       Long bi=b.getFk_A_id();
       Long ai=a.getId();
       if(bi==ai){
           System.out.println(true);
       }else{
           System.out.println(false);
       }
    }

结果:

测试类T--情况2:

       A a = new A();
       a.setId(290868562279530496L);
       B b = new B();
       b.setFk_A_id(290868562279530496L);
       if(a.getId()==b.getFk_A_id()){
           System.out.println(true);
       }else{
           System.out.println(false);
       }

       Long bi=b.getFk_A_id();
       Long ai=a.getId();
       if(bi==ai){
           System.out.println(true);
       }else{
           System.out.println(false);
       }
    }

结果:

看完这两个例子,问题就出现了,为什么属性赋值为1可以判断出值是否相等,而属性值赋值为290868562279530496却为false。那么首先给我的直觉是情况2比较的不是值,是对象的地址值。那么,得出这种结论也是合理的,因为Long类型本来就是引用数据类型,用==比较的就应该是对象的地址值。

那么为什么赋值为1时就能判断值相等,我们知道==只有在比较基本数据类型的时候比较的是值,引用数据类型比较的是地址值,那么很明显是因为将Long类型的1转换成了基本数据类型进行了比较,所以情况1比较的是值。

java中 int的最大值是 2^31-1 最小值是-2^31
Constant Value: 2147483647 (0x7fffffff)
Constant Value: -2147483648 (0x80000000)

 

测试类T--情况3:

A a = new A();
       a.setId(290868562279530496L);
       B b = new B();
       b.setFk_A_id(290868562279530496L);
       if(a.getId()==b.getFk_A_id()){
           System.out.println(true);
       }else{
           System.out.println(false);
       }

       long bi=b.getFk_A_id();
       long ai=a.getId();
       if(bi==ai){
           System.out.println(true);
       }else{
           System.out.println(false);
       }
    }

结果:

通过情况3的第二个输出我们可以知道,将两个属性赋值给long类型的变量,比较的是变量的值

 

测试类T--情况4:

A a = new A();
        a.setId(290868562279530496L);
        B b = new B();
        b.setFk_A_id(290868562279530496L);
        if (a.getId().equals(b.getFk_A_id())) {
            System.out.println(true);
        } else {
            System.out.println(false);
        }
}
}

结果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值