equals方法是java.lang.Object类的方法。
可以从三个方面来说明它们的区别:
1.对于基本类型变量来说。例如int、char,它们使用“equals”和“==”的作用是相同的。
例:
int i=5; int a=5;
那么i==a的结果是true, i.equals(a)的结果也是true。
2.对于字符串变量来说
字符串并不是基本数据类型,而是一个引用数据类型。对于引用数据类型来说,"=="比较的是两个对象在内存中的地址,"equals"比较的是两个对象的内容。例:
String a="abd";
String b="abd";
String c=new String("abd");
(1)a==b的结果是true;a.equals(b)的结果是true。前者说明a与b的引用对象是相同,后者说明两者的内容相同。
(2)a==c的结果是false;a.equals(c)的结果是true。那就是说a与b引用对象不同,内容相同。
那么为什么会出现这种情况呢?
原来在程序运行的时候,它会创建一个字符串缓冲池用以存放字符串变量。当你声明一个字符串变量时,程序会首先检查缓冲池中是否已有相同值的对象。如有,则直接返回这个对象的地址;若没有,则创建一个对象并将其放入缓冲池,然后再返回地址。而(2)之所以与(1)不同,是因为创建时使用了new操作符;明确的表明了想要新创建一个对象。因此a与c的内容虽相同,但对象却不同。
3.从一个自定义类的方面来说
任何类都直接或间接地是Object的子类,而Object中的equals方法却是通过“==”来实现的,即只能够比较两者的对象是否相同。
例:
class Examply{
Examply obj1=new Examply();
Examply obj2=new Examply();
}
此时obj1.equals(obj2)的实质就是obj1==obj2,结果都是false。
在2中,之所以可以使用equals来比较两者的内容,是因为在java的类库中,String类自己重写了equals方法,因此可以比较内容。像 StringBuffer类就没有重写自己的equals方法,因此他在使用时也是调用Object的equals方法,只能比较对象。在2的举例中,如改写为:
StringBuffer a=new StringBuffer("abd");
StringBuffer b=new StringBuffer("abd");
这时a.equals(b)的值为false。
因此,很多时候都需要自己去重写equals方法。
这是一个重写的实例: public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Student)) return false; Student s = (Student)obj; return number.equals(s.number); }