先附上equals的源码:
public boolean equals(Object obj) { return (this == obj); //判断本类中的对象和传过来的obj对象比较是否相等。比较的是地址,返回的是一个布尔类型 }
源码简洁明了,equals是Object类中的一个方法,很多时候我们都会用到
一、在Object中equals的作用是一个判断是否相等,而比较的规则是比较两个对象的地址,如果地址相等返回ture,否则返回false
eg:
public class equalstest { public static void main(String[] args) { Dog dd = new Dog(); Dog dd2 = new Dog(); dd.equals(dd2); //dd和dd2两个引用对象存储在栈内存中,保存的数据是两个不同的对象在堆内存中地址,显然两个不同的对象在堆内存中存储的地址不一样,所有返回false dd.equals(dd); //同理,dd和dd比较返回的是ture,因为本来就是一个对象 } }
我们可以得出equals比较的内容具体是:引用在栈内存中保存的地址。即dd和dd2在栈内存中保存的数据
二、因为所有创建的类都默认继承了Object,所以我们可以直接使用它,但是很多时候我们的需求并不是比较地址,这个时候就需要对equals进行重写
在很多java提供的类中,都重写equals来满足自己的需求,比如说String。
附上String中equals的源码:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
从源码中看出比较的内容是:字符串的内容是否相等
eg:
public class equalstest { public static void main(String[] args) { String aa = "abc"; String bb ="abc"; String cc ="def"; System.out.println( aa.equals(bb) ); //返回的是ture System.out.println( cc.equals(bb) ); //返回的是false } }
三、因此当我们需要用equals进行比较的时候,我们也可以进行重写,比较规则由我们自己来订
在myeclipse中,也可以直接右键source,生成equals方法。但是和没生成一个效果(不知道是否是我理解的太片面),只是方便我们进行重写,不重写也是按照继承过来的equals的规则进行比较。
如图