集合中的对象都需要重写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,则返回truereturn true;}
/** 自动重写的hashCode* @see java.lang.Object#hashCode()*/@Overridepublic 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)*/@Overridepublic boolean equals(Object obj) {//自身与传入的值比较 - 比较的是值if (this == obj)return true;//参数是null直接返回falseif (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;//如果一些不相同的情况都不符合,说明两个对象的属性值相同,返回truereturn true;}
