集合中的对象都需要重写equals和hashcode方法
    为了实现这个功能,我们需要新建一个实体类,是Object的子类,具备了equals方法
    Contains方法会调用参数的equals方法,依次为集合中的已经存在对象进行比较

    1. public boolean equals(Object obj){
    2. System.out.println("equals方法被调用了");
    3. //this: 表示contains方法的参数对象
    4. //obj: 集合中原有的对象
    5. //将Object类型的obj强制转换为子类类型
    6. Person otherP = (Person)obj;
    7. //重写比较规则
    8. //比较的是当前的对象的属性:名字,年龄
    9. if(!this.getName().equals(otherP.getName())){
    10. return false;
    11. }
    12. if(this.getAge() != otherP.getAge()){
    13. return false;
    14. }
    15. //如果上面两个都不是false,则返回true
    16. return true;
    17. }
    1. /*
    2. * 自动重写的hashCode
    3. * @see java.lang.Object#hashCode()
    4. */
    5. @Override
    6. public int hashCode() {
    7. //系统提供的一个默认的系数 - 通常不能改
    8. final int prime = 31;
    9. //定义一个hashCode的返回值
    10. int result = 1;
    11. //每次将结果*系数,再加上一个成员变量,目的是可以大大的降低不同成员变量返回相同的hashCode值的情况
    12. result = prime * result + age;
    13. result = prime * result + ((name == null) ? 0 : name.hashCode());
    14. return result;
    15. }
    16. /*
    17. * 自动重写的equals方法
    18. * @see java.lang.Object#equals(java.lang.Object)
    19. */
    20. @Override
    21. public boolean equals(Object obj) {
    22. //自身与传入的值比较 - 比较的是值
    23. if (this == obj)
    24. return true;
    25. //参数是null直接返回false
    26. if (obj == null)
    27. return false;
    28. //如果本身对象类型与参数的对象类型不一样,就返回false - 通过反射机制处理 - 后面说
    29. if (getClass() != obj.getClass())
    30. return false;
    31. //如果本身比较对象的类型和比较对象的类型一样,就转成相同的类型继续进行比较
    32. Person other = (Person) obj;
    33. if (age != other.age)
    34. return false;
    35. if (name == null) {
    36. if (other.name != null)
    37. return false;
    38. } else if (!name.equals(other.name))
    39. return false;
    40. //如果一些不相同的情况都不符合,说明两个对象的属性值相同,返回true
    41. return true;
    42. }