我创建了课程A
。然后我创建了两个类A
的对象。
A a1=new A(5);
A a2=new A(5);
然后,如果我尝试使用equals
方法比较对象,则返回false
。
if (a1.equals(a2)) // ->false
在同样的情况下,如果我使用像
这样的包装类Integer i1=new Integer(5);
Integer i2=new Interger(5);
if (i1.equals(i2)) // ->returns true
为什么呢?谁能解释一下?
答案 0 :(得分:6)
您必须覆盖班级equals()
中的A
方法。默认情况下,它使用从Object
类继承的实现,即比较引用的Object#equals(),即如果两个对象都是驻留在堆中的同一对象,则返回true
或者{{ 1}}。如果您需要检查对象内容是否相等,请覆盖类中的false
方法。
注意:在覆盖equals()
时覆盖hashCode()通常是一种很好的做法。
我提供了一个示例实现:
equals()
Integer类已经覆盖了此方法Integer#equals()。
将此对象与指定对象进行比较。当且仅当参数不为null并且是包含与此对象相同的int值的Integer对象时,结果才为真。
建议阅读:
答案 1 :(得分:2)
为此,您需要覆盖类equals()
的{{1}}方法
如果不覆盖该方法,它将使用A
类equals方法,该方法检查引用变量是否引用相同的对象。
使用Object
类,Integer
方法已被覆盖,并检查该值。
此外,无论何时覆盖equals()
,还要覆盖equals()
hashcode()
打印出public class A {
private int number;
A(int number){
this.number = number;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + number;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
A other = (A) obj;
if (number != other.number)
return false;
return true;
}
public static void main(String[] args) {
A a1 = new A(5);
A a2 = new A(5);
System.out.println(a1.equals(a2));
}
}
。
为什么呢?谁能解释一下?
使用true
类,Integer
方法已被覆盖,并检查该值。
答案 2 :(得分:2)
如果你有这个,
Integer i1=new Integer(5);
Integer i2=new Interger(5);
if(i1.equals(i2))
它将返回true
。
因为Integer
类会覆盖equals
方法来比较vales而不是比较引用。
对于包装类Integer,从-128到127的文字来自同一个池。
你会发现这个有趣的来自HERE, see this for answer:
Integer i1 = 127;
Integer i2 = 127;
if(i1==i2){
System.out.println("true"); //prints true
}else{
System.out.println("false");
}
Integer i3 = 128;
Integer i4 = 128;
if(i3==i4){
System.out.println("true");
}else{
System.out.println("false"); //prints false
}
答案 3 :(得分:0)
您应该为A类重写equals()方法
例如
class A{
int b;
A(int b){
this.b = b;
}
@Override
public boolean equals(A a){
return this.b ===a.b;
}
}
答案 4 :(得分:0)
这是因为当您在equals()
个实例上致电A
时,它会调用Object
类的等号,比较参考。
所以,如果你愿意的话:
instance1.equals(instance1); //will return true
要提供自定义等于实现,您必须在类中覆盖等于方法:
class A{
@Override
public boolean equals(Object obj){
return equality;
}
}