1.我们为什么要重写equals方法???
因为Java内置的equals方法和==其实是比较两个对象的引用是否等价,也就是说两个对象的内存地址是否相等,而我们在实际应用中,往往并不想用内存地址来比较相等性。比方说:
我定义了下面的一个类:
public class wei {
int x;
wei(int y){
x=y;
}
}
然后我想用类中的x来比较两个对象是否相等
于是我写了下面的一个程序:‘
public static void main(String[] args) throws IOException {
wei a=new wei(1);
List<wei> x=new ArrayList<wei>();
x.add(a);
wei b=new wei(1);
System.out.println(x.contains(b));
}
答案是false,也就是说Java将a和b看作是不同的变量,因为它们的内存地址并不相等。
那我们怎么实现我们想要用x来确定两个变量相等的目的呢,这就要用到重写equals
public class wei {
int x;
wei(int y){
x=y;
}
@Override
public boolean equals(Object o1) {
wei o3=(wei)o1;
return o3.x==this.x;
}
@Override
public int hashCode() {
return x;
}
}
我们重写equals方法(为了省事没有加上类型检查)
值得注意的是如果重写equals方法就必须重写hashCode方法,因为这样会将所以相同的值放入同样的内存地址
再来检测一下:
public static void main(String[] args) throws IOException {
wei a=new wei(1);
List<wei> x=new ArrayList<wei>();
x.add(a);
wei b=new wei(1);
System.out.println(x.contains(b));
}
返回true