equals ,hashCode 重写步骤的详解

来源:互联网 发布:xp系统解压缩软件 编辑:程序博客网 时间:2024/05/29 03:40

// 系统自动生成的对象的唯一编号
// 1. equals 相等的两个对象,hashCode 必须保持一致
// 系统为了提高效率,HashSet 等, 判断两个对象相等的时候,会先比较hashCode
// 如果一致,调用equals 进行比较,如果不一致,就认为不相同,就不再调用equals 方法了(equals 方法比较复杂)
// 重写equals 方法必须重写hashCode ,保证值相等对象,hashCode 也相等。
//
// 2. hashCode 相等的 equals 不一定相等
“`
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
// 可以传入任意对象
if (this == obj) // 同一个对象进行比较肯定是相同的
return true;
if (obj == null) // 如果参数为null,肯定不相等
return false;
if (!(obj instanceof People)) // instance 实例化,创建对象
return false; // instanceof 判断 是否是某个类的对象
// 判断 obj(传入的参数) 是否是People 或其子类的对象
// true 是, false 不是

      // 排除所有的错误情况,进行值的比较        People other = (People) obj;  // 强制转换为People 类型      // obj 的编译时类型是Object ,决定了我们写代码的时候能够调用哪些属性和方法      // 调用不了People 类的name 和 age 属性      // 通过强制转换,把编译时类型改为People,就可以调用People 的属性和方法了      // 比较两个对象的属性,是否相等      // 基本类型使用  == 进行值相等的比较      if (age != other.age)          return false;      // 引用类型使用equals 进行值相等的比较      if (name == null) {  // 如果名字为空,调用equals 方法会产生空指针异常          if (other.name != null)               return false;      } else if (!name.equals(other.name)) // 取反,不相等的时候返回false          return false;      return true; }      // HashSet 相同的元素只会添加一个,靠的是hashCode 和equals 方法      // 引用类型 == 比较的是地址,equals 默认比较的也是地址      // 可以重写equals 方法实现值的比较,比如:String      // 重写 equals 必须重写 hashCode,两者保持一致      // equals 相等,hashCode 相等,equals 不相等,hashCode 也不相等      // 重写equals 方法和 hashCode方法后,contains 比较的是值      System.out.println(list.contains(p2)); // true      // 重写equals 方法和 hashCode方法后,indexOf进行比较,是值的比较。contains 其实就是return indexOf(o) >= 0;      // 找到就返回对应的索引,找不到就返回 -1;      System.out.println(list.indexOf(p2)); // 0