集合中的对象都需要重写equals和hashcode方法
为了实现这个功能,我们需要新建一个实体类,是Object的子类,具备了equals方法
Contains方法会调用参数的equals方法,依次为集合中的已经存在对象进行比较
public boolean equals(Object obj){
System.out.println("equals方法被调用了");
//this: 表示contains方法的参数对象
//obj: 集合中原有的对象
//将Object类型的obj强制转换为子类类型
Person otherP = (Person)obj;
//重写比较规则
//比较的是当前的对象的属性:名字,年龄
if(!this.getName().equals(otherP.getName())){
return false;
}
if(this.getAge() != otherP.getAge()){
return false;
}
//如果上面两个都不是false,则返回true
return true;
}
/*
* 自动重写的hashCode
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
//系统提供的一个默认的系数 - 通常不能改
final int prime = 31;
//定义一个hashCode的返回值
int result = 1;
//每次将结果*系数,再加上一个成员变量,目的是可以大大的降低不同成员变量返回相同的hashCode值的情况
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
/*
* 自动重写的equals方法
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
//自身与传入的值比较 - 比较的是值
if (this == obj)
return true;
//参数是null直接返回false
if (obj == null)
return false;
//如果本身对象类型与参数的对象类型不一样,就返回false - 通过反射机制处理 - 后面说
if (getClass() != obj.getClass())
return false;
//如果本身比较对象的类型和比较对象的类型一样,就转成相同的类型继续进行比较
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
//如果一些不相同的情况都不符合,说明两个对象的属性值相同,返回true
return true;
}