1、判断两个对象中的内容是否相等
public class Test02 {
public static void main(String[] args) {
Person p1 = new Person("li", 21 , "男");
Person p2 = new Person("li", 21 , "男");
System.out.println(p1 == p2);
/*
* 关系运算符==判断的是两个变量的值是否相等
* p1变量保存堆中一个对象的引用地址,p2保存另一个对象的引用地址
*/
//通过equals来判断堆中两个对象的内容是否相同,但输出结果仍然为false
System.out.println(p1.equals(p2));
}
}
这是object中的equals方法也是通过 == 来判断的(ctrl+鼠标移动到equals处点击即可跳到此处)
所以我们需要重写equals方法
eclipse中可以自动生成重写方法:alt+shift+s
选择
选择需要重写的属性即可
public class Person {
String name;
int age;
String gender;
public Person(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
//重写equals方法
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((gender == null) ? 0 : gender.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
//年龄不相等直接返回false
if (age != other.age)
return false;
//判断性别
if (gender == null) {
if (other.gender != null)
//当前对象的gender为null但是参数对象的gender不为null,返回false
return false;
} else if (!gender.equals(other.gender))
//当前对象的gender不为null,但是和参数对象的gender不一样
return false;
//判断姓名
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
此时结果为:
总结:equals
使用关系 运算符 == 判断两个变量是否相等,如果两个变量相等,说明这两个变量引用堆中的同一个对象
如果想要判断堆中两个对象的内容(即各个成员变量的值)是否一样,需要重写equals()方法,根据哈希约定,如果两个对象的equals()相等,那么这两个对象的hashCode()也应该相等,即在重写equals()方法的同时,也要重写hashCode()