-
Object源码
public class Object { //native表明该方法是否操作系统实现,java调用操作系统底层代码获取哈希值
public native int hashCode();
//直接比较地址
public boolean equals(Object obj) { return (this == obj); }
}
-
重写场景
需要重写equals()的场景:对引用类型使用equals比较时
需要重写hashcode()的场景:hasMap集合key为对象时(hasMap底层使用key的hascode判断是否相同若key是引用类型这时需要重写对象的hashcode)
-
重写示例一
package indi.cyh.entity; /** * @ClassName Student * @Description TODO * @Author cyh * @Date 2021/2/5 0005 11:22 */ public class Student { private String name;// 姓名 private String sex;// 性别 private String age;// 年龄 private float weight;// 体重 private String addr;// 地址 // 重写hashcode方法 @Override public int hashCode() { int result = name.hashCode(); result = 17 * result + sex.hashCode(); result = 17 * result + age.hashCode(); return result; } // 重写equals方法 @Override public boolean equals(Object obj) { if(!(obj instanceof Student)) { // instanceof 已经处理了obj = null的情况 return false; } Student stuObj = (Student) obj; // 地址相等 if (this == stuObj) { return true; } // 如果两个对象姓名、年龄、性别相等,我们认为两个对象相等 if (stuObj.name.equals(this.name) && stuObj.sex.equals(this.sex) && stuObj.age.equals(this.age)) { return true; } else { return false; } } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public float getWeight() { return weight; } public void setWeight(float weight) { this.weight = weight; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } }
-
重写示例二
//利用lombok项目提供的注解功能 等效于示例一
@Data
@EqualsAndHashCode(exclude = {"name","sex","age"})
public class Student {
private String name;// 姓名
private String sex;// 性别
private String age;// 年龄
private float weight;// 体重
private String addr;// 地址
}