equals是Object类中方法。判定两个对象是否相同。定义为 x.queals(y),当x和y是同一个对象的应用返回true。
否则返回false
J2set提供了一些类,重写了object的queal用法,判断所引用的对象是否为同一个类且属性内容相同时返回true。
下面我们看一个小测试
public class equal{ public static void main(String[] args){ cat c1=new cat(); cat c3=new cat(); System.out.println(c1==c3); } } class cat{ int color; int height,weight; }
输出为
不一样,是不是体重和颜色高度不一样才造成的呀,那么我们写一个构造函数,让他们都一样,在看看效果
public class equal{ public static void main(String[] args){ cat c1=new cat(1,2,3); cat c3=new cat(1,2,3); System.out.println(c1.equals(c3)); } } class cat{ intcolor; intheight,weight; public cat (int color,int height,int weight){ this.color=color; this.height=height; this.weight=weight; } }
再来看一下编译效果/还是false
为何会这样呢,永远都不相同。这是equals的默认比较,它比较的是当前对象和比较对象是否相同(x==y)和刚
才的写法是一样的。
我们来解释下吧。他们比较的是地址,看内存分布图。new出来的两个对象引用始终是不同的
这里比较的是引用的内容,所以是不同的。
那么我们比较的是什么呢,比较两个对象的内容是否相同.
如何比较:
对象都不能为空
互等对称的
自反的。
提供的方法的实现。我们需要去重写父类的方法,去掉默认的比较。自己重新实现
Public boolean equals(Object obj){
}
看实现
public class equal{ public static void main(String[] args){ catc1=new cat(1,2,4); catc3=new cat(1,2,4); System.out.println(c1.equals(c3)); } } class cat{ intcolor; intheight,weight; public cat (int color,int height,int weight){ this.color=color; this.height=height; this.weight=weight; } public boolean equals(Object obj){ if(obj==null)return false; else{ //判断哪类的 if(objinstanceof cat){ //强制转换 cat c=(cat)obj; if(c.color==this.color&& c.height==this.height && c.weight==this.weight){ return true; } } } returnfalse; } }
测试结果
通过三番测试我们发现,我们看到的并不是我们看到的。对象的equals,指的是对象的内容是否相同。需要我们去重写equals对象的比较方法才能更好的比较对象是否一致。