-
equals默認是比較內存地址,所以我們有時候需要重寫方法
-
重寫equals一定要重寫hashcode()方法!
判斷重複的依據是:equals-true,hashCode-true一致性。
默認情況
public class Student {
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class StudentTest {
public static void main(String[] args) {
Student s1=new Student("aa",13);
Student s2=new Student("aa",13);
System.out.println(s1.equals(s2));//false,默認比較的是內存地址
}
}
重寫方法,自定義規則
public class Student {
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
return Objects.hash(this.name, this.age);
}
@Override
public boolean equals(Object obj) {
if(obj==null)
return false;
if(!(obj instanceof Student))
return false;
Student s2=(Student) obj;
return this.name.equals(s2.name)&&this.age==s2.age;
}
}
public class StudentTest {
public static void main(String[] args) {
Student s1=new Student("aa",13);
Student s2=new Student("aa",13);
System.out.println(s1.equals(s2));//true,重寫了equals方法
}
}
例子:
public class Kind {
private String kindname;
private String discription;
private int version;
public String getKindname() {
return kindname;
}
public void setKindname(String kindname) {
this.kindname = kindname;
}
public String getDiscription() {
return discription;
}
public void setDiscription(String discription) {
this.discription = discription;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public Kind(String kindname, String discription, int version) {
super();
this.kindname = kindname;
this.discription = discription;
this.version = version;
}
@Override
public String toString() {
return "Kind [kindname=" + kindname + ", discription=" + discription + ", version=" + version + "]";
}
@Override
public int hashCode() {
String str1=this.kindname.replaceAll(" ", "").toLowerCase();
String str2=(this.version+"").substring(0, 2);
return Objects.hash(str1,str2);
}
@Override
public boolean equals(Object obj) {
if(obj==null)
return false;
if(!(obj instanceof Kind))
return false;
Kind another=(Kind) obj;
if(this.kindname==null && another!=null)
return false;
if(this.kindname!=null&& another==null)
return false;
boolean result= this.kindname.replaceAll(" ", "").equalsIgnoreCase(another.kindname.replaceAll(" ", ""));
if(!result)
return false;
return (this.version+"").substring(0, 2).equals((another.version+"").substring(0, 2));
}
}