以前老背面试题,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);
}
}
}
结果: