// 系统自动生成的对象的唯一编号
// 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