equals在java中很重要,和==区别开。
1.声明格式 public boolean equals(Object obj)
比较规则为:当参数obj引用的对象与当前对象为同一个对象时,返回true,否则返回false.
比如以下两个对象animal1和animal2,引用不同的对象,因此用==或equals()方法比较的结果为false;而animal1和animal3变量引用用一个DOg对象,因此用==或者equals()方法比较的结果为true.
Animal animal1=new Dog();
Animal animal2=new Cat();
Animal animal3=animal1;
则animal1==animal2(False)
animal1.equals(animal2)(false)
animal1==animal3(true)
animal1.equals(animal3)(true)
---------------------------------------------------
而jdk类中有些类覆盖了object类equals()方法,比较规则为:如果两个对象类型一直,并且内容一样,则返回true,这些类有:java.io.file,java.lang.string,包装类(Integer,double等)
比如: Integer int 1=new Integer(1);
Integer int2=new Integer(1);
String str1=new String("helloworld");
String str2=new String("helloworld");
int1=int2 输出:TRUE
str1==str2(false)
str1.equals(str2)(true)
当然,可以自定义覆盖object类的equals()方法,重新定义比较规则,比如,下面Person类的equals()比较规则为:只要两个对象都是Person类,并且他们的属性name都相同,则比较结果为true,否则返回false
public class Person{
private String name;
public Person(String name){
this.name=name;
}
public boolean equals(Object o){
if(this==0)return true;
if(!o instanceof Person)return false;//instanceof一般是用来判断一个不知具体属于哪个类来实例化的时候进行判断的,没有实例化,是起不到任何作用的
final Person other=(Person)o;
if(this.name().equals(other.name()))
return true;
else
return false;
}
注意,在重写equals方法时,要注意满足离散数学上的特性
1.自反性:对任意引用值x, x.equals(x)的返回值一定为true.
2.对称性:对于任何引用值x,y当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3.传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4.一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5.非空性:任何非空的引用值x, x,equals(null)的返回值一定为false