简介:讲解对象的HashCode和equals⽅法使⽤
1.HashCode⽅法
1)顶级类Object⾥⾯的⽅法,所有类都是继承Object的,返回值int类型
2)根据⼀定的hash规则(存储地址,字段,或者⻓度等),映射成⼀个数值,即散列值
2.Equals⽅法
1)顶级类Object⾥⾯的⽅法,所有类都是继承Object的,返回值boolean类型(判断对象是否一样)
2)根据⾃定义的匹配规则,⽤于匹配两个对象是否⼀样, ⼀般逻辑是如下
//判断地址是否⼀样
//⾮空判断和class类型判断
//强转
//对象⾥⾯的字段⼀⼀匹配
class User {
private int age;
private String name;
private Date time;
//省略setter和getter⽅法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name) &&
Objects.equals(time, student.time);
}
@Override
public int hashCode() {
return Objects.hash(age, name, time);
}
}
问题:当向集合中插⼊对象时,如何判别在集合中是否已经存在该对象,⽐如Set确保存储对象的唯⼀,并判断是不是同个对象呢?
1)依据hashCode和equals进⾏判断,所以Set存储的对象必须重写这两个⽅法
2)判断两个对象是否⼀样,⾸先判断插⼊obj的hashcode值是否存在,hashcode值不存在则直接插⼊集合,值存在则还需判断equals⽅法判断对象是否相等
package Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class Native {
public static void main(String []args){
Set<User> userSet = new HashSet<>();
userSet.add(new User("jack",10));
userSet.add(new User("tom",28));
userSet.add(new User("lucy",80));
userSet.add(new User("tom",28));
System.out.println(userSet);
}
}
class User{
private int age;
private String name;
public User(String name,int age){
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(age,name);
}
@Override
public boolean equals(Object obj) {
//判断地址是否⼀样
if(this == obj){
return true;
}
//⾮空判断和class类型判断
if(obj == null || getClass() != obj.getClass()){
return false;
}
//强转
User user = (User) obj;
//对象⾥⾯的字段⼀⼀匹配
return age == user.age && name.equals(user.name);
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
//[User{age=80, name='lucy'}, User{age=28, name='tom'}, User{age=10, name='jack'}, User{age=28, name='tom'}]
不重写(idea可以智能提示)
必须重写这两个方法,否则不唯一